Asp.net mvc 不引人注目的验证不适用于动态添加的局部视图

Asp.net mvc 不引人注目的验证不适用于动态添加的局部视图,asp.net-mvc,razor,partial-views,unobtrusive-validation,dynamically-generated,Asp.net Mvc,Razor,Partial Views,Unobtrusive Validation,Dynamically Generated,在动态添加内容后,我目前面临验证问题 我有一个强类型为模型订单的视图。此订单可以有许多项目。该模型如下所示: public class Order { [Key] [HiddenInput] public int id { get; set; } [Display(Name = "Order Number")] public string number { get; set; } [Display(Name = "Order Date")]

在动态添加内容后,我目前面临验证问题

我有一个强类型为模型订单的视图。此订单可以有许多项目。该模型如下所示:

public class Order
{
    [Key]
    [HiddenInput]
    public int id { get; set; }

    [Display(Name = "Order Number")]
    public string number { get; set; }

    [Display(Name = "Order Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime date { get; set; }

    [Required(ErrorMessage = "Beneficiary is required.")]
    [Display(Name = "Beneficiary")]
    public int beneficiary_id { get; set; }

    [Display(Name = "Beneficiary")]
    public Beneficiary beneficiary { get; set; }

    [Display(Name = "Items")]
    public List<Item> items { get; set; }

    [Display(Name = "Payment Method")]
    public List<PaymentMethod> payment_methods { get; set; }
}
。。。我的部分观点是这样的:

@model trackmeMvc.Models.Model.Order
@{
    ViewBag.Title = "Create";
    Html.EnableClientValidation();
    Html.EnableUnobtrusiveJavaScript();
}

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script>

@using (Html.BeginForm("Create", "Order", FormMethod.Post, new { @id = "create_order" }))
    {
    @Html.ValidationSummary(true, "Order creation was unsuccessful. Please correct the errors and try again.")

    <div class="editor-label">
        @Html.LabelFor(m => m.date)<req>*</req>
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(m => m.date, new { @id = "order_date" })<br />
        @Html.ValidationMessageFor(m => m.date)
    </div>
@model trackmeMvc.Models.Model.Item 

@{
    Layout = "";    
    Html.EnableClientValidation(true);

    if (this.ViewContext.FormContext == null)
    {
        this.ViewContext.FormContext = new FormContext();
    }
}

<div class="editRow">

@using (Html.BeginCollectionItem("order_items"))
{

    @Html.DropDownListFor(m => m.item_id, @items, "None", new { @style = "width:205px;", @id = "ddlItems", @class="ddlItem", @name="ddlItemList" })
    @Html.ValidationMessageFor(m => m.item_id)

    ...

}

</div>
因此,默认情况下,我有一个空项从控制器发送到视图,以显示一个空行。该项已验证,但无论单击“添加项”后出现什么,都会从该部分显示另一行,但我无法使其进行验证。我尝试将验证放在部分视图中,在主表单中的文档准备就绪之前,我应用了我读到的所有内容,结果总是一样的:验证第一行,而不是其他行。我试过验证史蒂文·桑德森(Steven Sanderson)是否是为了这个目的而做的,但仍然没有成功,甚至验证了partials 下面的页面是部分验证的专用页面


我应该怎么做才能使验证生效?

好的,我将从一个新的答案开始

在调用$.validator.unobtrusive.parse之前,请从表单中删除原始验证程序和unobtrusive validation,如下所示:

var form = $("#main_div").closest("form");
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);

同样的答案也被记录在案。

对我有效的是在调用加载部分视图后重新应用验证器。在我的例子中,我使用的是$.post.then,但您可以使用AJAX调用的.always回调执行类似的操作

$.post(url, model, function (data) {
    //load the partial view
    $("#Partial").html(data);
}).then(function () {
    $("form").each(function () { $.data($(this)[0], 'validator', false); });
    $.validator.unobtrusive.parse("form");
});

你好,谢谢你的回复。我使用的是MVC 3,很抱歉订单上的项目,实际上是项目输入错误。@items是一个选择列表,我从所有项目的数据库中获取。。在order类的列表项中,所有项属性都是必需的,发生的事情是在我的控制器中,默认情况下,我放置了一个空项,并且该行在客户端被验证。因此,我已经替换了脚本,不使用您建议的缩小版本。现在我已经检查了,数据val=true,以及所有添加到动态添加控件中的内容。。继续…因此,当我尝试删除不引人注目的验证时,它就消失了,当我尝试将其放回时,它只验证第一页加载时的项目,没有动态添加的项目。。我曾尝试使用chrome进行调试,但当我点击$.validator.unobtrusive.parse$main\u div.closestform;它转到函数的末尾,点击脚本文件jquery-1.5.1.min.js,它不应该转到验证程序脚本吗?我对chrome的调试不太熟悉。。但缺失的环节在哪里呢?因为当我删除验证程序并重新添加它们时,它们会重新工作,这意味着它正在被调用,但出于某种原因,它不会影响动态添加的内容,它只是在添加任何控件之前验证所有的内容。。那会是什么呢?我把断点放在那里,就像你说的,我检查了一下,它也在动态添加的元素上运行,它不起作用了吗??这是怎么回事?我已经用你的代码构建了一个类似的场景,验证对我来说是有效的。你肯定还遗漏了什么。Chrome调试器是否报告任何错误?可能重复
var form = $("#main_div").closest("form");
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);
$.post(url, model, function (data) {
    //load the partial view
    $("#Partial").html(data);
}).then(function () {
    $("form").each(function () { $.data($(this)[0], 'validator', false); });
    $.validator.unobtrusive.parse("form");
});