不显眼的validation不适用于dynamic添加的局部视图
我目前在dynamic添加内容后面临validation问题。
我有一个强types模型( Order
)的视图。 这个订单可以有很多项目。 模型如下所示:
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; } }
我input订单信息以及该特定订单的项目。 我尝试了几种dynamic添加内容的方法,最后是用Steven Sanderson的方式 。
在我看来,我有正常的订单信息,然后是项目,我的模型看起来像这样:
@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>
…
<script type="text/javascript"> $(document).ready(function () { $("#addItem").click(function () { var formData = $("#main_div").closest("form").serializeArray(); $.ajax({ url: "/IPO/BlankItemRow", type: "POST", //data: formData, cache: false, success: function (html) { $("#editorRows").append(html); //$.validator.uobtrusive.parseDynamicContent("form *"); //$("#editorRows").removeData("validator"); //$("#editorRows").removeData("unobtrusiveValidation"); //$.validator.unobtrusive.parse("#editorRows"); //$.validator.unobtrusive.parse("#create_ipo"); //$.validator.unobtrusive.parseDynamicContent($(this).first().closest("form")); //$.validator.unobtrusive.parse($("#new_ipo_item")); //$.validator.unobtrusive.parseElement($("#editorRows").find(".editRow:last").children().find("select")); //$("#editorRows").find(".editRow:last").find("select").each(function () { //alert($(this).attr("id")); //$.validator.unobtrusive.parseElement($(this)); //$.validator.unobtrusive.parseDynamicContent($(this)); //$.validator.unobtrusive.parseDynamicContent($(this).attr("name")); //}); //$("#editorRows").children().find(".editRows:last").find("*").each(function () { // alert($(this).attr('id')); //$.validator.unobtrusive.parseDynamicContent('input'); //}); //var form = $(this).closest("form").attr("id"); //$(form).removeData("validator"); //$(form).removeData("unobtrusiveValidation"); //$.validator.unobtrusive.parse(form); } }); return false; }); }); </script>
那些是我尝试过的一些东西,没有任何工作。
我得到了parseDynamicContent
从应用不显眼的jQueryvalidation到ASP.Net MVC中的dynamic内容 。 我在每一个我能想到的情况下都尝试过,但仍然没有运气。
我也尝试了常规parsing,从窗体中删除validation,然后再次应用,但仍然没有validation新添加的元素:
<div id="editorRows"> @foreach (var item in Model.items) { @Html.Partial("_NewItem", item) } </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>
所以发生了什么事情,我有一个空的项目从控制器发送到视图默认情况下,显示一个空行。 该项目进行了validation,但无论什么时候我点击添加项目后,出现另一行,从部分,但我不能得到它validation。 我试图在部分视图中进行validation(在主表单准备好文档之前)以及我应用的所有内容,结果总是一样的:validation第一行,而不validation其他行。 我尝试了Steven Sanderson为此目的所做的validation – 仍然没有运气 – 即使是在这个链接中find的partials的validation,以及后面的特定于部分validation的页面。
我该怎么做才能使这个validation工作?
好吧,我将在这里重新开始一个新的答案。
在调用$.validator.unobtrusive.parse
之前,从表单中删除原始的validation器和不显眼的validation,如下所示:
var form = $("#main_div").closest("form"); form.removeData('validator'); form.removeData('unobtrusiveValidation'); $.validator.unobtrusive.parse(form);
这里也logging了同样的答案。