Возникли проблемы с тем, что временные данные не очищаются

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

public class BaseController : Controller
{
    //
    // GET: /Base/
    public void Warning(string message)
    {
        TempData.Add(Alerts.WARNING, message);
    }
    public void Success(string message)
    {
        TempData.Add(Alerts.SUCCESS, message);
    }

    public void Information(string message)
    {
        TempData.Add(Alerts.INFORMATION, message);
    }

    public void Error(string message)
    {
        TempData.Add(Alerts.ERROR, message);
    }
}

Нет, если я получу любой другой контроллер от BaseController, это возможно сделать

public ActionResult Test()
{
   Success("This is a success Alert");
}

Теперь в _alert partial view я проверяю временные данные и гроулю их с помощью Toastr.

_предупреждает частичный просмотр

@if (TempData.ContainsKey(Alerts.SUCCESS))
{
    foreach (var value in TempData.Values)
    {
        <script>    
            toastr.success("@value.ToString()");
        </script>

    }


}

@if (TempData.ContainsKey(Alerts.ERROR))
{
    foreach (var value in TempData.Values)
    {
        <script>

            toastr.error("@value.ToString()");
        </script>
    }
}

@if (TempData.ContainsKey(Alerts.INFORMATION))
{
    foreach (var value in TempData.Values)
    {
        <script>

            toastr.warning("@value.ToString()");
        </script>
    }
}

@if (TempData.ContainsKey(Alerts.WARNING))
{
    foreach (var value in TempData.Values)
    {
        <script>    
            toastr.warning("@value.ToString()");
        </script>
    }
}

этот _alert частичный вид отображается в моем _layout виде. Что является основным макетом приложения.

Все все страницы используют этот макет.

Проблема:

Проблема, с которой я сталкиваюсь, заключается в том, что после отправки сообщения с контроллера, например:

Success("This is a success message");

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

Что я могу сделать, чтобы решить эту проблему?

Вероятно, мне нужно очистить временные данные, но где?

Я попытался очистить TempData от просмотра: но это не позволяет мне. Я получаю сообщение об ошибке в браузере, говорящее, что я могу выполнять только назначение, увеличение, уменьшение и создание объекта и тому подобное, но не TempData.Clear();. Кроме того, было бы неплохо выполнить очистку TempData на стороне клиента, не так ли?


person Cybercop    schedule 05.03.2014    source источник
comment
TempData сохраняется до чтения. Взгляните на stackoverflow.com/questions/ 5953302/ предлагается изменить оператор if с TempData.ContainsKey на TempData[], так как это считается чтением   -  person Cookie    schedule 05.03.2014
comment
@Cookie, если TempData очищается при чтении, не будет ли TempData[Alerts.INFORMATION] != null считаться чтением? Если это правда, то мое сообщение, которое я показываю внутри оператора if, что с этим произойдет?   -  person Cybercop    schedule 05.03.2014
comment
рычите его с помощью Toastr ‹- Меня, как разработчика, и забавляет, и беспокоит, что это допустимая строка текста.   -  person BenM    schedule 05.03.2014
comment
@Rondles Ха-ха, я не знал, как правильно это сказать ... Вероятно, оповещение с помощью тоастра?   -  person Cybercop    schedule 05.03.2014
comment
Нет, пожалуйста, прочитайте другой ответ, TempData.ContainsKey не вызывает чтение, доступ к TempData с ключом   -  person Cookie    schedule 05.03.2014


Ответы (2)


Кажется, это сделало трюк

@if (TempData.ContainsKey(Alerts.SUCCESS))
{
    foreach (var value in TempData.Values)
    {
        <script>    
            toastr.success("@value.ToString()");
        </script>

    }
    TempData.Remove(Alerts.SUCCESS);

}

но я до сих пор не знаю, стоит ли очищать TempData от просмотра, как я это сделал.

Предложения?

person Cybercop    schedule 05.03.2014

Не могли бы вы попробовать изменить все варианты использования ContainsKey на ненулевую проверку?

Изменить это

@if (TempData.ContainsKey(Alerts.INFORMATION))
{
}

To

@if (TempData[Alerts.INFORMATION] != null)
{
}

По-видимому, TempData очищается только при чтении, а вызов ContainsKey не считается чтением. Соответствующая статья Stackoverflow здесь

Обновление: успешно выполнен следующий код. Каждый раз, когда я перезагружаюсь, TempData["S"] имеет значение null и пополняется сообщением (так что это ожидаемое поведение).

Базовый Контроллер

public class BaseController : Controller
{
    public void Success(string message)
    {
        TempData.Add("S", message);
    }
}

HomeКонтроллер

public ActionResult Test()
{
    Success("This is a success Alert");
    return View();
}

Вид

@if (TempData["S"] != null)
{
    foreach (var value in TempData.Values)
    {
        @value.ToString()
    }
}
person Bruno V    schedule 05.03.2014
comment
если TempData очищается при чтении, то не будет ли TempData[Alerts.INFORMATION] != null считаться чтением? Если это правда, то мое сообщение, которое я показываю внутри оператора if, что с этим произойдет? - person Cybercop; 05.03.2014
comment
Я попробовал, но теперь мое сообщение не появляется. - person Cybercop; 05.03.2014
comment
Я сам попробовал код, и для меня он работает с проверкой не на ноль, см. мой обновленный ответ. - person Bruno V; 05.03.2014
comment
Также следует иметь в виду Furthermore, if you use RedirectResult or RedirectToRouteResult, they will persist even if they are read. Итак, в этом случае все равно будет работать, если вы используете RedirectResult или RedirectToRouteResult в качестве возвращаемого типа? - person Cybercop; 05.03.2014