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, таким образом, это вероятно проблема здесь.

5
задан Jason Berkan 18 October 2010 в 14:21
поделиться

1 ответ

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

5
ответ дан 14 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: