ASP.Net MVC2 После публикации, как очистить форму, если пользователь нажимает кнопку «Назад»?

В моем веб-приложении после нажатия кнопки «Отправить» в форме ASP.NET MVC пользователю отображается либо экран «Ошибка», либо экран «Успех». В случае ошибки пользователю предлагается нажать кнопку «Назад» в браузере, исправить все, что он сделал неправильно, и повторить попытку отправки.

Это прекрасно работает, потому что когда пользователь нажимает назад, все ранее введенные данные остаются на экране в различных полях. Но в случае экрана «Успех» я хотел бы, чтобы данные очищались, если пользователь нажимает «Назад», чтобы он не мог просто случайно повторно отправить данные снова.

Как это сделать в ASP.NET MVC?


person Pretzel    schedule 07.10.2010    source источник


Ответы (1)


Для этого можно использовать шаблон Post-Get-Redirect. Это не специфично для asp-mvc, но, как говорит Вики,

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

Щелчок назад не является безопасным способом справиться с этим. Некоторые браузеры не сохраняют состояние формы после отправки. Этот шаблон напрямую решает проблему с данными accidentally re-submit.

Что касается кода, взгляните на этот пост в блоге Jag Reehal о том, как проводить модульное тестирование контроллеров.

[HttpPost]
public ActionResult Create(SomeViewModel model)
{
  if (ModelState.IsValid)
  {
     // do some stuff that saves your data and then...
     return RedirectToAction("Success");
  }
  else
  {
     // your model is not valid so return the form back to the user for 
     // additional modifications.
     return View(model);
  }   
}

Примечание: хотя в приведенном выше примере для проверки данных используется ModelState, у вас может быть собственный набор процедур проверки и проверки ошибок, которые также можно использовать в этом шаблоне.

person Ahmad    schedule 07.10.2010
comment
Я пробовал это раньше, и это не сработало для меня, но, возможно, я делаю что-то не так. Позвольте мне попробовать еще раз и вернуться к вам. - person Pretzel; 08.10.2010
comment
Все равно не повезло. Я попытаюсь воспроизвести то, что я делаю, в тестовом проекте (ой, удалите весь ненужный код, чтобы я мог показать вам, что я делаю). Я отпишусь через несколько дней. Спасибо, что заглянули ко мне! :) - person Pretzel; 12.10.2010