Следует ли использовать RenderAction с формами?
Мои настройки:
- есть вид для маршрута, как:
/Pages/Details/2
- представление сведений о странице имеет
<% Html.RenderAction("CreatePageComment", "Comments"); %>
для отображения формы комментария - форма комментариев сообщения в
Comments/CreatePageComment
-
/Comments/CreatePageComment
возвращаетRedirectToAction
при успешном создании комментария - Все это прекрасно работает
Мой вопрос:
Если есть ошибка проверки, как я должен вернуться к /Pages/Detail/1
и показать ошибку в форме комментария?
- Если я использую
RedirectToAction
, похоже, проверка является сложной задачей; должен ли я даже использовать шаблон Post-Redirect-Get для ошибок проверки, а не просто возвращать? - Если я возвращаю
View()
, он возвращает меня к представлениюCreateComment.aspx
(с проверкой, но только формой на белой странице), а не к маршруту/Pages/Details/2
, который вызвалRenderAction
.
Если шаблон PRG должен использоваться, то я думаю, что мне просто нужно научиться выполнять проверку при использовании PRG. Если нет - и мне кажется, что с этим лучше справиться, вернувшись View()
- тогда я не знаю, как вернуть пользователя к исходному виду, показав ошибки формы, при использовании RenderAction
.
1 ответ:
Я полагаю, что ответ заключается в использовании TempData, например:
На мой взгляд (/шаги / детали) у меня есть:
<!-- List comments --> <% Html.RenderAction("List", "Comments", new { id = Model.Step.Id }); %> <!-- Create new comment --> <% Html.RenderAction("Create", "Comments", new { id = Model.Step.Id }); %>
В моем контроллере комментариев у меня есть мой метод записи:
// POST: /Comments/Create [HttpPost] public ActionResult Create([Bind(Exclude = "Id, Timestamp, ByUserId, ForUserId")]Comment commentToCreate) { if (ModelState.IsValid) { //Insert functionality here return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId }); } //If validation error else { //Store modelstate from tempdata TempData.Add("ModelState", ModelState); //Redirect to action (this is hardcoded for now) return RedirectToAction("Details", "Steps", new { id = commentToCreate.StepId }); } }
Также в контроллере комментариев есть мой метод GET:
// // GET: /Comments/Create public ActionResult Create(int id) { if (TempData.ContainsKey("ModelState")) { ModelStateDictionary externalModelState = (ModelStateDictionary)TempData["ModelState"]; foreach (KeyValuePair<string, ModelState> valuePair in externalModelState) { ModelState.Add(valuePair.Key, valuePair.Value); } } return View(new Comment { StepId = id }); }
Это отлично работает для меня, но я был бы признателен за обратную связь о том, является ли это хорошей практикой и т. д.
Кроме того, я заметил, что MvcContrib имеет украшение ModelStateToTempData, которое, кажется, делает это, но более чистым способом. Я собираюсь попробовать, что в следующий.