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");
});