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"> </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();