2011-01-29 4 views
1

Я думал, что понял 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); 
} 
+0

Проверьте исходный код. Это может быть ваш браузер, заполняющий его для вас. – Alxandr

+0

Возможно, вы захотите запустить Fiddler (для IE) или Firebug и посмотреть фактический HTTP-запрос, сгенерированный браузером – WorldIsRound

ответ

3

Браузер будет кэшировать GET запросы, которые из тот же URL. Если вы добавите переменную querystring, которая является случайной, тогда запрос GET будет отличаться каждый раз, и браузер не будет кэшировать результат.

0

Этого следовало ожидать.

Когда вы отправляете форму через GET, вы сериализуете ее элементы и передаете их цели через QueryString. Таким образом, имеет смысл, что ваше значение поиска будет частью модели MVC в следующем запросе. Когда вы используете хелпер Html.TextBox, он автоматически вводит значение модели в качестве значения ввода HTML. Вот почему вы видите покрытие ценности.

Одно решения, чтобы избежать этого, чтобы не использовать HTML Helper, чтобы сделать вход:

<form action="" method="get"> 
    <div> 
    <input type="text" name="search" /> 
    <input type="submit" value="Search" /> 
    </div> 
</form> 

Затем вы должны получить чистый лист вы ожидаете после каждого представления формы.

Смежные вопросы