1

Web 应用程序 ASP MVC Core 2.1 我有两个具有父子关系的模型,它们是 Course 和 CourseEdition;一个课程可以有多个版本。

我显示课程详细信息的页面还显示了其版本列表。我使用 JQuery 用该版本的详细信息填充同一页面:单击其中一个版本时,我有一个 DIV 填充了它的详细信息数据。我想以重定向到版本详细信息来结束某些操作(即在一个版本中注册一个或多个人)。

我已经建立了这样的机制:

在控制器操作“RegisterPeople”中,我将 TempData 设置为要重定向到的版本的 ID,然后重定向到 CourseController 中的 Details 操作。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> RegisterEmployees([Bind("CourseId,CourseEditionId,Subscribers")] RegistrationData regData)
    {
        TempData["NextCourseId"] = regData.CourseId;
        TempData["NextEditionId"] = regData.CourseEditionId;
        if (ModelState.IsValid)
        {
           <do something>

           return RedirectToAction("Details", "Courses", new { id = regData.CourseId });
        }

在这里(课程控制器,详细信息操作)我读取 TempData 并将其值复制到 ViewBag 中。

public async Task<IActionResult> Details(int? id)
{
    <do something>

    ViewBag.GotoEditionId = TempData["NextEditionId"] ;
    return View();
    }

在详细信息视图中,我有一个 DIV,其数据属性由 ViewBag 值(版本 ID)填充,

<div id="GotoEditionId" data-ceid="@ViewBag.GotoEditionId">&nbsp;</div>
@section Scripts {
    @{await Html.RenderPartialAsync("_CourseScripts");}
}

现在,在 _CourseScript.cshtml 中,当单击此 div 时会触发一个 JQuery 事件处理程序,该处理程序具有填充版本 div 的魔力。

$(document).ready(function () {

   $(document).on("click", "#GotoEditionId", function (e) {
        e.preventDefault();
        var params = {};
        params["id"] = $(this).data("ceid");
        $.ajax({
            url: $("#GetEditionUrl").data('get-edition'),
            type: "GET",
            data: params,
            success: function (result) {
                $("#EditionBlock").html(result);
            },
            error: function (err) {
                alert("error");
                $("#EditionBlock").html(err.responseText);
            }
        });
    });

    var GotoEditionId = $("#GotoEditionId").data("ceid");
    if (GotoEditionId > 0) {
        $("#GotoEditionId").trigger("click");
    }

})

当我使用 Visual Studio 进行开发时,这非常有效。当我部署到远程 IIS 服务器时,TempData 填写在“注册”操作中,但在输入“详细信息”操作时发现它为空。

谁是罪魁祸首?为什么 TempData 在开发模式下持续存在并在生产中消失?

编辑 1

使用会话

在 Startup.cs 中

public void ConfigureServices(IServiceCollection services)
{
services
    .AddMvc()
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    .AddSessionStateTempDataProvider() 
    .AddJsonOptions(config =>
     {
         config.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
     });
services.AddSession(); 

.....

public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env)
{
 ....
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseSession();
4

0 回答 0