MVC Razor表单验证来自Render Action



我是新的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. 如何重定向到搜索的页面?
  2. 如果这个原始页面是"POST到"-也就是说,它是渲染的东西,基于POST请求?在这种情况下,我们不会能够以任何简单的方式"复制"这篇文章;
  3. 我们重定向到原始页面后,如何沟通搜索模型(或只是它的错误),这是我们失败了验证?

考虑到所有这些挑战,我将首先认真考虑用AJAX样式制作这个搜索表单。如果适合你的话,那将是一个简单得多的解决办法。

如果AJAX不是一个选项,我看到以下解决方案,以各自的问题:

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

最新更新