来自渲染动作的MVC Razor表单验证

时间:2011-11-15 08:00:36

标签: asp.net-mvc razor validation renderaction

我是MVC的新手,并试图实现我期望的常见问题。我有一个简单的搜索表单,我想在网站的每个页面上实现。我希望此部分维护自己的代码,以便我不必在每个页面上复制它。

到目前为止,我已经能够通过在模板页面上调用渲染操作来完成此操作。渲染操作填充了quicksearch表单。当我提交表单时,我能够验证表单,但是我还没有找到一种方法来重新显示带有验证信息的同一页面。我更喜欢一种只刷新表单区域的方法,但只要页面重新显示,我就会接受完整的回发。

模板渲染调用

@{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 :(得分:0)

我发现您遇到以下问题:

  1. 如何重定向回搜索的页面?
  2. 如果此原始页面是&#34;发布到&#34;该怎么办? - 那是基于POST请求呈现的东西吗?在这种情况下,我们不会 能够重新生产&#34;这个POST很简单;
  3. 在我们重定向到原始页面后,如何传达搜索模型(或者只是它的错误),我们未能 验证
  4. 鉴于所有这些挑战,我首先会认真考虑以AJAX风格制作此搜索表单。如果它适合你,这将是更容易的解决方案。

    如果AJAX不是一个选项,我会看到以下解决方案:

    1. 我会在搜索表单中使用原始页面的URL创建一个隐藏字段。验证失败后,我们可以重定向到此URL(只检查它是否为本地URL,没有人试图制造某些东西);
    2. 这是一个主要问题 - 尝试重播原始POST并不容易,但也可能不需要 - 只需检查这是否是一个问题;
    3. 您可以使用TempData字典将错误或模型传达回原始页面。