Следует ли использовать RenderAction с формами? - PullRequest
5 голосов
/ 10 января 2010

Моя настройка:

  • Просмотр маршрута, например: /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 голосов
/ 12 января 2010

Я считаю, что ответом является использование 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:

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

...