Прерывистые результаты с ASP. NET MVC TempData - иногда оно теряет свою ценность - PullRequest
0 голосов
/ 23 января 2020

В приложении ASP. NET MVC у меня есть действие контроллера, которое вызывает бизнес-уровень для добавления объекта.

Если по бизнес-причинам объект не может быть добавлен, Для свойства error установлено значение true вместе с описанием.

Если установлено значение true, я задаю ключ TempData для сообщения об ошибке, а затем перенаправляю на представление с кодом для отображения ошибки, сохраненной в TempData, если это существует. Иногда отображается условный блок, а иногда нет.

Вот соответствующий код в моем контроллере

var added = ModelHelper.CreateSessionCode(model);

if(added.Error)
{
    TempData["SessionCodesMessage"] = model.ErrorDescription;
    TempData["MessageClass"] = "alert-danger";
}
else
{
    TempData["SessionCodesMessage"] = "Created session code";
    TempData["MessageClass"] = "alert-success";
}

return RedirectToAction("Index");

Тогда, на мой взгляд, у меня есть этот код:

@if (TempData["SessionCodesMessage"] != null)
{
    <div class="alert @TempData["MessageClass"] alert-dismissable" style="margin-top: 8px;">
        <a href="#" class="close" data-dismiss="alert" aria-label="close">&times;</a>
        @(TempData["SessionCodesMessage"])
    </div>
}

И кажется несовместимым, когда сообщение отображается или нет. Может ли это быть проблемой кеша браузера или подобным? После пошагового выполнения кода я могу подтвердить, что выполнение переходит в оба условных блока контроллера в зависимости от результата добавления объекта.

1 Ответ

1 голос
/ 23 января 2020

Хорошо, TempData похоже на ViewData, но с разницей. Он может содержать данные между двумя последовательными запросами, но после этого они уничтожаются.

Если вы хотите сохранить значение TempData, вы можете использовать Keep :

TempData.Keep()

В вашем случае:

var added = ModelHelper.CreateSessionCode(model);

if(added.Error)
{
    TempData["SessionCodesMessage"] = model.ErrorDescription;
    TempData.Keep("SessionCodesMessage");
    TempData["MessageClass"] = "alert-danger";
    TempData.Keep("MessageClass");
}
else
{
    TempData["SessionCodesMessage"] = "Created session code";
    TempData.Keep("SessionCodesMessage");
    TempData["MessageClass"] = "alert-success";
    TempData.Keep("MessageClass");
}

return RedirectToAction("Index");

ИЛИ

Вы также можете использовать Peek , если вы хотите быть откровенным каждый раз, когда вы хотите получить его, не удаляя его.

var added = ModelHelper.CreateSessionCode(model);

if(added.Error)
{
    //second request, PEEK value so it is not deleted at the end of the request
    TempData["SessionCodesMessage"]; = "Created session code";
    object sessioncodevalue= TempData.Peek("SessionCodesMessage");
    TempData["MessageClass"]; = "alert-success";
    object messageclassvalue= TempData.Peek("MessageClass");
}
else
{
    //second request, PEEK value so it is not deleted at the end of the request
    TempData["SessionCodesMessage"]; = "Created session code";
    object sessioncodevalue= TempData.Peek("SessionCodesMessage");
    TempData["MessageClass"]; = "alert-success";
    object messageclassvalue= TempData.Peek("MessageClass");
}

return RedirectToAction("Index");

Вы можете использовать Peek, когда вы всегда хотите сохранить значение для другого запроса. И используйте Keep, когда сохранение значения зависит от дополнительных логи c.

Вы можете обратиться к этой статье для получения дополнительной информации об этих функциях и о том, как вы можете использовать их в своих View: https://www.c-sharpcorner.com/UploadFile/ansh06031982/using-tempdata-peek-and-keep-in-Asp-Net-mvc/

...