Я думал, что понял MVC до сих пор. Для меня GET должен быть с чистого листа. Но сегодня я распознал, что MVC предполагает, что GET является POST, если запрос страницы получает от себя. В текстовом поле всегда должен отображаться текст «Красный», но вместо этого он сохраняет свое последнее значение в предыдущем представлении. Действуя как HTTPPost. Вы должны раскомментировать ModelState.Clear, чтобы действовать как HttpGet. Это кажется мне ошибкой.Почему MVC сохраняется на HttpGet?
<form action="" method="get">
<div>
<%=Html.TextBox("search") %>
<input type="submit" value="Search" />
</div>
</form>
[HttpGet]
public ActionResult Index(string search)
{
//ModelState.Clear();
ViewData["search"] = "Red";
var items = GetYourTestData;
if (!string.IsNullOrEmpty(search))
{
var items2 = items.Where(x => x.Color == search).ToList();
return View(items2);
}
return View(items);
}
Результаты поиска возвращают правильные и разные данные, поэтому это не кеш браузера. Для целей страницы результатов поиска не имеет смысла перенаправлять на другую страницу, чтобы избежать этого. Вот почему я выбрал GET, думая, что он должен быть чистым каждый раз.
Как я уже говорил в описании. Другое содержимое на странице меняется, поэтому оно не является кешем. Uncomment ModelState.Clear() и все хорошо, так что это не кеш. Вы можете поместить динамический ярлык datetime, всегда отображающий последнее время с сервера, и он меняется. Это также доказывает, что это не кеш страниц. Это очень простой тест. Да, просто уверен, что есть сила тяжести, MVC2 framework 4.0 рассматривает HTTPPost, если запрашиваемая страница HttpGet совпадает с запросом. Если вы не знаете об этом во время программирования, результаты могут быть катастрофическими. Например, если кто-то вроде TurboTax использует MVC, я надеюсь, что их разработчик это осознает. ... ViewData ["AdjustedTaxAmount"] = 3435.00; ... не будет работать, если они не назовут это ModelState.Clear().
Я не знаю, почему там должно быть ModelState на получите один верный Обходной Наследственное контроллер от базового класса
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
ModelState.Clear();
}
base.OnActionExecuted(filterContext);
}
Проверьте исходный код. Это может быть ваш браузер, заполняющий его для вас. – Alxandr
Возможно, вы захотите запустить Fiddler (для IE) или Firebug и посмотреть фактический HTTP-запрос, сгенерированный браузером – WorldIsRound