ASP.NET MVC PartialView不会发出验证标记

Zol*_*iqa 8 validation unobtrusive-javascript data-annotations asp.net-mvc-3

我在MVC 3应用程序中创建了一个局部视图.此视图具有如下强类型模型:

public class ProductViewModel
{
    [Required, Display(Name = "Product price")]
    public decimal? ProductPrice
    {
        get;

        set;
    } ...
}
Run Code Online (Sandbox Code Playgroud)

在我的动作方法中,我像这样调用PartialView方法

PartialView("ProductViewModel", products[0]);
Run Code Online (Sandbox Code Playgroud)

但是在页面上我看不到验证逻辑的任何标记,如果页面上有任何错误,则没有任何反应.如果我将此局部视图用作编辑器模板,则可以正常工作.任何帮助表示赞赏.

编辑:更具体地说,我有一个HTML表单,我想通过ajax更新添加标记(如果用户点击一个按钮,我想在该表单中添加新标记).如果我静态地包含这些控件,我的意思是如果我在页面加载时渲染它们,验证工作,但如果我通过ajax调用向该表单添加控件,则不会为这些控件插入验证标记.我的局部视图看起来像这样:

@Html.LabelFor(x => x.ProductPrice)

@Html.TextBoxFor(x => x.ProductPrice)

@Html.ValidationMessageFor(x => x.ProductPrice)
Run Code Online (Sandbox Code Playgroud)

我的表单看起来像这样:

@using (Html.BeginForm())
{
    <div id="div_Products">
        @Html.EditorFor(x => x)
    </div>

    <input type="submit" value="Compare" />
}
Run Code Online (Sandbox Code Playgroud)

上面的代码效果很好,验证工作正常.在服务器端,我调用一个看起来像这样的动作方法:

[HttpPost]
public ActionResult InsertProduct()
{
    var newProductVM = new ProductViewModel{ ProductPrice = 789 };

    return PartialView("~/Views/Nutrition/EditorTemplates/ProductViewModel.cshtml", newProductVM);
}
Run Code Online (Sandbox Code Playgroud)

我发现MVC引擎只有在发现控件位于表单控件内时才会插入那些验证标记.当我尝试通过ajax调用更新我的表单控件时,MVC无法知道它们将被放置在表单元素中,这就是为什么它不会为它们发出任何验证逻辑,我想.

Rob*_*Rob 10

将它放在部分视图的顶部,您将获得渲染到html输出中的验证消息:

if (this.ViewContext.FormContext == null) 
{
    this.ViewContext.FormContext = new FormContext(); 
}
Run Code Online (Sandbox Code Playgroud)

如果您使用ajax添加表单字段,则可以使用以下内容将新字段添加到DOM /页面后触发新字段以添加到验证中:

$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$.validator.unobtrusive.parse("form");
Run Code Online (Sandbox Code Playgroud)

编辑/更新(2013年美联储2013年):我刚刚在Visual Studio 2012中破解了部分视图的FormContext,似乎使用最新版本的jQuery和Validation等我不需要添加3用于验证的javascript(上面)行在ajax上动态工作,这太棒了!


Ale*_*ler 1

您是否在 web.config 或视图本身中启用了不显眼的验证?

在 web.config 中:

<configuration>
    <appSettings>
        <add key="ClientValidationEnabled" value="true"/>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

或内部代码:

HtmlHelper.ClientValidationEnabled = true;
HtmlHelper.UnobtrusiveJavaScriptEnabled = true;
Run Code Online (Sandbox Code Playgroud)