提问人:Zoliqa 提问时间:12/22/2011 最后编辑:Zoliqa 更新时间:2/23/2013 访问量:4433
ASP.NET MVC PartialView 不发出验证标记
ASP.NET MVC PartialView doesn't emit validation markup
问:
我在 MVC 3 应用程序中创建了一个部分视图。此视图具有强类型模型,如下所示:
public class ProductViewModel
{
[Required, Display(Name = "Product price")]
public decimal? ProductPrice
{
get;
set;
} ...
}
在我的操作方法中,我像这样调用 PartialView 方法
PartialView("ProductViewModel", products[0]);
但是在页面上,我看不到验证逻辑的任何标记,如果页面上有任何错误,则不会发生任何事情。如果我将此部分视图用作编辑器模板,它就可以工作。 任何帮助都是值得赞赏的。
编辑:更具体地说,我有一个HTML表单,我想通过ajax更新向其添加标记(如果用户单击按钮,我想向该表单添加新标记)。如果我静态地包含这些控件,我的意思是如果我在加载页面时呈现它们,验证会起作用,但是如果我通过ajax调用将控件添加到该窗体,则不会为这些控件插入验证标记。我的部分视图如下所示:
@Html.LabelFor(x => x.ProductPrice)
@Html.TextBoxFor(x => x.ProductPrice)
@Html.ValidationMessageFor(x => x.ProductPrice)
我的表格如下所示:
@using (Html.BeginForm())
{
<div id="div_Products">
@Html.EditorFor(x => x)
</div>
<input type="submit" value="Compare" />
}
上面的代码运行良好,验证有效。在服务器端,我调用了一个操作方法,如下所示:
[HttpPost]
public ActionResult InsertProduct()
{
var newProductVM = new ProductViewModel{ ProductPrice = 789 };
return PartialView("~/Views/Nutrition/EditorTemplates/ProductViewModel.cshtml", newProductVM);
}
我发现 MVC 引擎只有在发现控件位于表单控件内部时才会插入这些验证标记。当我尝试通过ajax调用更新我的表单控件时,MVC无法知道它们将被放置在表单元素中,这就是为什么它不会为它们发出任何验证逻辑的原因,我想。
答:
您是否在 web.config 或视图本身中启用了不显眼的验证?
在 web.config 中:
<configuration>
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>
</configuration>
或内部代码:
HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;
评论
在“分部视图”中,添加以下内容 (C#/Razor):
@Html.ValidationMessageFor(model => model.ProductPrice)
使用客户端验证,可以重新验证页面加载后加载的元素。由于 MVC 现在使用 jQuery 验证,因此如果启用了客户端验证;
这可能会对你有所帮助。
把它放在部分视图的顶部,你会得到呈现到 html 输出中的验证消息:
if (this.ViewContext.FormContext == null)
{
this.ViewContext.FormContext = new FormContext();
}
如果您使用 ajax 添加表单字段,则可以在将新字段添加到 DOM/Page 后触发它们添加到验证中,如下所示:
$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");
编辑/更新(2013年23日美联储): 我刚刚在 Visual Studio 2012 中首次破解了部分视图的 FormContext,似乎使用最新版本的 jQuery 和 Validation 等,我不需要添加 3 行 javascript(上面)即可进行验证,以便在 ajax 上动态工作,这很棒!
评论
不确定这对您来说是否仍然是一个问题,但解决方案是调用:
$.validator.unobtrusive.parse($('#your-new-form-div'));
通过 AJAX 加载窗体标记/控件后。这将分析您的新表单元素,并创建您在视图中指定的客户端验证。
评论