Передача TempData с RedirectToAction работает в Visual Studio, но не работает - PullRequest
0 голосов
/ 22 ноября 2018

Веб-приложение ASP MVC Core 2.1 У меня есть две модели с отношениями Родитель-Дети, это Course и CourseEdition;Курс может иметь много изданий.

На странице, где я отображаю сведения о курсе, также отображается список его изданий.Я использую JQuery, чтобы заполнить ту же страницу сведениями об издании: при нажатии на одно из изданий у меня появляется DIV, заполненный его подробными данными.Существуют действия (т. Е. Регистрация одного или нескольких человек в редакции), которые я хотел бы завершить перенаправлением на сведения о редакциях.

Я настроил механизм, подобный следующему:

ВДействие контроллера «RegisterPeople» Я устанавливаю TempData с идентификатором издания, на которое я хочу быть перенаправлен, затем перенаправляю на действие Details в CourseController.

[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) Iпрочитайте TempData и скопируйте его значение в ViewBag.

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

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

В подробном представлении у меня есть DIV с атрибутом данных, заполненным значением ViewBag (идентификатор издания),

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

Теперь в _CourseScript.cshtml обработчик событий JQuery запускается, когда нажатие на этот div делает магию заполнения 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();
...