Моя установка:
/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
.
Это чувствует себя подобно игре, где Вы касаетесь головы и потираете живот одновременно. Я не был хорош в тот одном также. Я являюсь новым в MVC, таким образом, это вероятно проблема здесь.
Я считаю, что ответ заключается в использовании TempData, например:
На мой взгляд (/Steps/Details) у меня есть:
<!-- List comments -->
<% Html.RenderAction("List", "Comments", new { id = Model.Step.Id }); %>
<!-- Create new comment -->
<% Html.RenderAction("Create", "Comments", new { id = Model.Step.Id }); %>
В контроллере комментариев у меня есть POST-метод:
// 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, которое, похоже, делает это, но более чистым способом. Я попробую это сделать дальше.