noo*_*obi 44 asp.net-mvc partial-views dynamically-generated razor unobtrusive-validation
我目前在动态添加内容后面临验证问题.
我有一个强烈键入模型(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; }
}
Run Code Online (Sandbox Code Playgroud)
我输入订单信息以及该特定订单的项目.我尝试了几种方法来动态添加内容,最后采用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>
Run Code Online (Sandbox Code Playgroud)
...
<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>
Run Code Online (Sandbox Code Playgroud)
这些是我尝试过的一些东西,没有任何作用.
我parseDynamicContent从ASP.Net MVC中的应用不显眼的jquery验证到动态内容.我在我能想到的每一个场景中都尝试过,但仍然没有运气.
我还尝试了常规解析,从表单中删除验证然后再次应用它,但仍然没有验证新添加的元素:
<div id="editorRows">
@foreach (var item in Model.items)
{
@Html.Partial("_NewItem", item)
}
</div>
Run Code Online (Sandbox Code Playgroud)
......我的部分视图看起来像这样:
@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>
Run Code Online (Sandbox Code Playgroud)
所以发生了什么,默认情况下我从控制器向视图发送了一个空项,以显示一个空行.该项目已经过验证,但是当我点击添加项目时,无论出现什么,从该部分出现另一行,但我无法让它进行验证.我试图将验证放在局部视图中(在主窗体中准备好文档之前),以及我应用的所有内容,它总是相同:验证第一行,而不是其他行.我尝试了Steven Sanderson为此目的进行的验证 - 仍然没有运气 - 甚至是部分验证,在此链接 和随后的页面中找到了特定于部分验证的页面...
我该怎么做才能使这个验证工作?
dan*_*wig 95
好的,我将在这里重新开始一个新的答案.
在您致电之前,请$.validator.unobtrusive.parse从表单中删除原始验证器和不显眼的验证,如下所示:
var form = $("#main_div").closest("form");
form.removeData('validator');
form.removeData('unobtrusiveValidation');
$.validator.unobtrusive.parse(form);
Run Code Online (Sandbox Code Playgroud)
这同样的答案被记录在这里.
| 归档时间: |
|
| 查看次数: |
41714 次 |
| 最近记录: |