Проверка формы бритвы MVC из действия Render - PullRequest
2 голосов
/ 15 ноября 2011

Я новичок в MVC и пытаюсь реализовать то, что, как я ожидаю, будет обычной проблемой.У меня есть простая поисковая форма, которую я хочу внедрить на каждой странице сайта.Я хочу, чтобы этот раздел содержал свой собственный код, чтобы мне не приходилось дублировать его на каждой странице.

До сих пор я мог сделать это, вызвав действие рендеринга на странице шаблона.Действие рендеринга заполняет форму быстрого поиска.Когда я отправляю форму, я могу проверить форму, однако я не нашел способа повторно отобразить ту же страницу с информацией проверки.Я бы предпочел способ, который бы просто обновлял область формы, но я бы принимал полный постбэк, пока страница отображается заново.

Вызов шаблона визуализации

@{Html.RenderAction("Display", "QuickSearch");}

ActionController

    [HttpPost]
    public ActionResult Submit(QuickSearchModel qsModel)
    {
        if (!ModelState.IsValid)
        {
            return PartialView(qsModel);
        }

        //Perform redirect
    }

 [ChildActionOnly]
        public ActionResult Display()
        {
           //populate model
           return View(qsModel);
         }

Просмотр быстрого поиска

<div>
    @using (Html.BeginForm("Submit", "QuickSearch"))
    { 
        @Html.ValidationSummary(true)
        @Html.LabelFor(m => m.Destination)@Html.EditorFor(m => m.Destination)@Html.ValidationMessageFor(m => m.Destination)<br />
        @Html.LabelFor(m => m.ArrivalDate)@Html.EditorFor(m => m.ArrivalDate)@Html.ValidationMessageFor(m => m.ArrivalDate)
        @Html.LabelFor(m => m.DepartureDate)@Html.EditorFor(m => m.DepartureDate)@Html.ValidationMessageFor(m => m.DepartureDate)<br />
        @Html.LabelFor(m => m.Adults)@Html.DropDownListFor(model => model.Adults, new SelectList(Model.AdultsSelectOptions, "value", "text", Model.Adults))<br />
        @Html.LabelFor(m => m.Children)@Html.DropDownListFor(model => model.Children, new SelectList(Model.ChildrenSelectOptions, "value", "text", Model.Children))<br />
        <input id="qsSubmit" name="qsSubmit" type="submit" value="Submit" />
    }
</div>

Заранее благодарим за любую помощь!

1 Ответ

0 голосов
/ 15 ноября 2011

Я вижу, что у вас есть следующие проблемы:

  1. Как перенаправить обратно на страницу, с которой был выполнен поиск?
  2. Что если эта оригинальная страница была "POSTed"to "- то есть что-то рендеринг, основанный на POST-запросе?В этом случае мы не сможем «воспроизвести» этот POST каким-либо простым способом;
  3. После того, как мы перенаправили на исходную страницу, как сообщить модель поиска (или просто ее ошибки), котораянам не удалось проверить?

Учитывая все эти проблемы, я бы сначала серьезно подумал о создании этой формы поиска в стиле AJAX.Это было бы намного более простым решением, если бы оно подходило вам.

Если AJAX не вариант, я вижу следующие решения соответствующих вопросов:

  1. Я бы сделал скрытое поле вФорма поиска с URL исходной страницы.Если проверка не удалась, мы можем перенаправить на этот URL (просто убедитесь, что это локальный URL, и никто не пытается что-то затормозить);
  2. Это серьезная проблема - попытка воспроизвести исходный POST не легка, номожет и не понадобиться - просто проверьте, не является ли это проблемой;
  3. Вы можете использовать словарь TempData для сообщения об ошибках или модели на исходную страницу.
...