Странная проблема с кэшированием (?) В ASP.Net MVC - PullRequest
2 голосов
/ 16 декабря 2008

Наличие странных проблем с ASP MVC, развернутым на IIS6 (Windows 2003). Я упростил код контроллера до следующего:

<AcceptVerbs(HttpVerbs.Get)> _
Public Function CloseBatches() As ActionResult
    ViewData("Title") = "Close Batches"
    ViewData("Message") = Session("Message")
    Return View()
End Function

<AcceptVerbs(HttpVerbs.Post)> _
Public Function CloseBatches(ByVal RequestId As String) As ActionResult

    Session("Message") = "Yadda yadda blah"

    Return RedirectToAction("CloseBatches")

End Function

Контроллер изначально делал больше, конечно, но ограничился этим, чтобы попытаться устранить неполадки. Страница имеет базовый HTML-код ViewPage (ссылка на главную страницу и т. Д.), А затем;

<p><%=ViewData("Message")%></p>
<%Using Html.BeginForm("CloseBatches", "Home", New With {.RequestId = "Close"})%>
    <input type="submit" id="Close" value="Close"/>
<%End Using%>

Как вы можете видеть, я пытаюсь использовать шаблон Post-Redirect-Display, который сейчас кажется наиболее подходящим. Проблема в том, что когда вы нажимаете кнопку, сообщение не появляется, независимо от того, сколько раз вы нажимаете кнопку. Однако, если вы выполняете обновление / F5, текст действительно появляется - затем обновите снова, и он исчезнет - обновите снова, и он появится - повторите!

У меня были точки останова на обеих функциях контроллера, и они попадают в них в правильных точках, я прошел по коду и никаких ошибок не происходит, поэтому необходимо заполнить ViewData, но страница просто не всегда показывает это !

Протестировано с IE7 и FF3 - последний кажется немного более прерывистым, поскольку иногда он работает!

Есть идеи? Что-то очевидное, что мне не хватает? Может ли происходить какое-то странное кеширование?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 16 декабря 2008

Измените ваш код следующим образом:

<AcceptVerbs(HttpVerbs.Get)> _
Public Function CloseBatches() As ActionResult
    ViewData("Title") = "Close Batches"
    Return View()
End Function

<AcceptVerbs(HttpVerbs.Post)> _
Public Function CloseBatches(ByVal RequestId As String) As ActionResult
    TempData("Message") = "Yadda yadda blah"
    Return RedirectToAction("CloseBatches")
End Function

<p><%=ViewData.Eval("Message")%></p>
<%Using Html.BeginForm("CloseBatches", "Home", New With {.RequestId = "Close"})%>
    <input type="submit" id="Close" value="Close"/>
<%End Using%>

Обратите внимание, что ViewData.Eval говорит: "Получить значение из ViewData, если оно есть, или из TempData, если его нет". Это правильное место , чтобы искать сообщение.

Я вообще не использую Session в своих приложениях MVC.

0 голосов
/ 16 декабря 2008

Извините, я должен был упомянуть, что я изначально использовал TempData, но переключился на использование Session, чтобы убедиться, что данные Сообщения были доступны для каждого запроса, чтобы упростить тестирование. В пошаговом режиме он действительно существует и проходит через бит ViewData ("Message") = Session ("Message") каждый раз, и отладчик показывает ViewData как имеющий элемент Message в нем. Бит

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

Я посмотрю в бит .Eval, чтобы увидеть, решает ли это что-нибудь. Спасибо.

0 голосов
/ 16 декабря 2008

Я столкнулся с той же проблемой, я думаю, что я сузил ее, чтобы возникать только при использовании RedirectToAction Иногда это работает, а иногда нет. Похоже, что работает в IE7, как и ожидалось, но в FF3 это не так.

Я попробовал оба этих метода на своей мастер-странице, чтобы проверить, установлено ли это значение

TempData.ContainsKey("Error") 

и

ViewData.Eval("Error")
0 голосов
/ 16 декабря 2008

Я не знаю, с какой проблемой вы столкнулись, но попробуйте использовать TempData вместо Session.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...