Цикл проверки и обработки ошибок MVC

#c# #asp.net-mvc-3 #razor

#c# #asp.net-mvc-3 #razor

Вопрос:

У меня есть 2 метода действий в одном контроллере,

Указатель:

 public ActionResult Index(string url)
{
   // take the url as a param and do long tasks here  
   ViewBag.PageTitle = "title";  
   ViewBag.Images = "images";  
   // and some more view bags  
   return View();
}
  

Это индексное представление содержит форму, которая отправляется в другой метод в том же контроллере.

 public ActionResult PostMessage(string msg, string imgName)  
{  
   // save data in the db
   // but on error I want to navigate back to the Index view but without losing data the  user fielded before submit the form.
  // Also need to pass an error message to this index view to show
}
  

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

Мне нужно знать наилучшую практику для выполнения такого сценария.

Ответ №1:

Обычно лучшим подходом является создание типа ViewModel для вашей формы. Добавьте атрибуты к свойствам этой модели, чтобы определить, что сделает ее «неправильной». Заставьте вашу форму использовать методы, подобные @Html.TextBoxFor различным полям. Затем пусть ваш класс postMessage принимает объект этого типа, а не принимает имя сообщения и изображения напрямую. Затем вы можете проверить модель и снова вернуть представление, если модель недействительна.

См. http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx для некоторых примеров кода, следующих этому шаблону.

Ответ №2:

Вы можете указать имя представления, которое хотите вернуть:

 public ActionResult PostMessage(string msg, string imgName)  
{
    if (SomeErrorWhileSavingInDb)
    {
        // something wrong happened => we could add a modelstate error
        // explaining the reason and return the Index view.
        ModelState.AddModelError("key", "something very wrong happened when trying to process your request");
        return View("Index");
    }

    // everything went fine => we can redirect
    return RedirectToAction("Success");
}
  

Комментарии:

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

2. @Amr ElGarhy, вам придется установить их еще раз PostMessage в случае, если вы повторно отобразите тот же вид. Кстати, вы не должны использовать какой-либо ViewBag. Я бы рекомендовал вам использовать модели представления.

Ответ №3:

Просто перенаправьте обратно к действию индекса

 return RedirectToAction("Index");
  

Для этого метода существуют перегрузки, которые позволяют передавать значения маршрута и другую информацию.

Комментарии:

1. Таким образом, он потеряет все значения, которые были введены пользователем в полях ввода. Немного раздражает, если вам приходится начинать все сначала каждый раз, когда возникает ошибка на стороне сервера.