Наилучшая практика для возврата ответа из частичного представления
-
18-09-2019 - |
Вопрос
Я пишу простую платформу для ведения блога с использованием ASP.NET MVC.Мой вопрос касается форм, содержащихся в частичных представлениях, и обработки ответа, ошибок проверки или успеха от контроллера.
У меня есть представление элемента записи в блоге, которое имеет связанный контроллер, который возвращает запись для заданного URL.В это представление встроено частичное представление, содержащее форму для отправки комментариев к сообщению.Форма частичного просмотра отправляется на отдельный контроллер, который обрабатывает добавление комментариев.Внутри действия добавить комментарий я выполняю проверку и добавляю ошибки в объект ModelState.
Проблема в том, что я должен вернуть RedirectResult при действии частичного просмотра, чтобы пользователь был возвращен к исходному элементу post , что означает, что я теряю объект ModelState или любые сообщения об успешном завершении, которые я хочу вернуть.
Я видел, как люди упоминали использование TempData для передачи информации о проверке или успешном завершении обратно в исходное представление, но для меня это звучит немного по-хакерски.Действительно ли это решение?Если да, то может ли кто-нибудь порекомендовать хороший пример его использования?Если нет, является ли это признаком более серьезных проблем в выбранной мной архитектуре?
Решение
В прошлом я использовал шаблон PRG, попробуйте
Другие советы
Вы можете заставить действие добавить комментарий вызвать действие просмотреть публикацию...
Что-то вроде этого, я думаю:
public class PostController
{
... blah ...
public ActionResult ViewPost(int postId)
{
Post post = PostRepository.GetPost(postId);
return View("ViewPost", post);
}
public ActionResult AddComment(int postId, string comment, string otherInfo)
{
//Validate stuff, setting modelstate etc
//If it isn't valid, return the same post view (modelstate will stay)
if (!ModelState.IsValid)
return this.ViewPost(postId);
//If it is valid then we want to save it and follow PRG pattern
PostRepository.Save(newValidComment);
TempData["Message"] = "Thanks for your comment!";
return RedirectToAction("ViewPost", new {id = postId});
}
}
Или вариация той же концепции...
ХТХС,
Чарльз
Рассматривали ли вы возможность использования библиотек Ajax просто для публикации этой области страницы?Таким образом, вам не нужно было бы перенаправлять.