#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. Таким образом, он потеряет все значения, которые были введены пользователем в полях ввода. Немного раздражает, если вам приходится начинать все сначала каждый раз, когда возникает ошибка на стороне сервера.