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 });
}
在这里(课程控制器,Details Action),我读了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"> </div>
@section Scripts {
@{await Html.RenderPartialAsync("_CourseScripts");}
}
现在,在_CourseScript.cshtml中,单击此div会产生填充版本div的魔力,就会触发JQuery事件处理程序。
$(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();