Следует ли использовать 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.

Это похоже на игру, в которой вы одновременно постукиваете себя по голове и потираете живот. В этом я тоже был не силен. Я новичок в MVC, так что, скорее всего, проблема здесь.
1 5

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, которое, кажется, делает это, но более чистым способом. Я собираюсь попробовать, что в следующий.