Ajax 调用后 MVC3 不显眼的验证不起作用 [英] MVC3 Unobtrusive Validation Not Working after Ajax Call

查看:27
本文介绍了Ajax 调用后 MVC3 不显眼的验证不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好的,这是交易,我在 SO 上看到了一些与此问题相关的帖子,但没有任何效果对我有用.

基本上,我选择了从部分视图加载的下拉列表,我试图根据之前选择的下拉列表过滤每个后续下拉列表的内容.

如果我只是将调用放在 div 容器中的局部视图并加载页面,则数据注释的验证工作正常,主要是必需的属性.

但是,如果我尝试通过 AJAX 加载与此处设置的相同的部分,则必需验证不起作用,任何人都可以在此之后发布表单和 KABOOM.

我发现有人说在成功回调中你需要让客户端验证器重新解析表单,我正在尝试这样做,但它似乎不起作用.

我有一个看起来像这样的视图...

 @model Area51.Models.Workflow.AddReportableItemToBatchActionModel@{ViewBag.Title = "将可报告的项目添加到批处理中";布局 = "~/Views/Shared/_Layout.cshtml";}<script type="text/javascript">$(函数(){变量淡出延迟 = 150;$(".jqDatePicker").datepicker({日期格式:'m/d/yy',onSelect:函数(日期){$("#categoryContainer").show(fadeDelay);}});$('#Category').change(function () {RetrieveItemsForCategory();$("#itemContainer").show(100);});$('#Item').live('change', function () {RenderPartialForUOMByItem();});函数 RetrieveItemsForCategory() {var category = $("#Category :selected").val();$.ajax({类型:POST",url: '@Url.Action("RenderPartialForLocationItemsByCategory","BatchWorkflow")',数据:类别="+ 类别,成功:功能(结果){$("#itemContainer").html(result.toString());$("#itemContainer").show(100);重新绑定验证();},错误:函数(请求,状态,错误){alert("抱歉!此时无法请求您选择的项目.");}});}函数 RenderPartialForUOMByItem() {var item = $("#Item :selected").val();$.ajax({类型:POST",url: '@Url.Action("RenderPartialForUOMByItem","BatchWorkflow")',数据:项目="+项目,成功:功能(结果){$("#quantityContainer").html(result.toString());$("#quantityContainer").show(100);重新绑定验证();},错误:函数(请求,状态,错误){alert("抱歉!此时无法请求您选择的项目.");}});}函数重新绑定验证(){alert("重新绑定验证");$.validator.unobtrusive.parse("#frmAddItem");}});//结束 OnLoad 事件<h3 class="pageHeader">批次:@Model.BatchName</h3><div align="center">@{Html.BeginForm("AddItemToBatch", "BatchWorkflow", null, FormMethod.Post, new { id = "frmAddItem" });}@Html.ValidationSummary(true)<fieldset style="width:60%"><legend>向批次添加项目</legend><div><h3>选择添加项目的日期</h3>@Html.EditorFor(x => x.EventDate,null)<br/>

<div id="categoryContainer" style="display:none"><小时/><h3>选择库存类别</h3>@Html.EditorFor(x => x.Category,null)<br/>

<div id="itemContainer" style="display:none">@* @{Html.RenderAction("RenderPartialForLocationItemsByCategory", "BatchWorkflow", new { category = Model.Category });}*@

<div id="quantityContainer" style="display:none">@* @{Html.RenderAction("RenderPartialForUOMByItem", "BatchWorkflow", new { item = Model.Item });}*@

<div id="reportingDataContainer" style="display:none"><小时/><h3>该添加影响了多少批料?</h3>@Html.EditorFor(x => x.ConsumedWineQuantity)(加仑)<br/><小时/><h3>由于这种添加,批次体积的增加是多少?</h3>@Html.EditorFor(x => x.ProducedWineQuantity)(加仑)

<div style="display:block"><div></div><span><button type="button" id="btnCancel" class="linkBut​​ton" value="Cancel" onclick="location.href='@Url.Action("Home","Home",null)';">取消</button></span><span><button type="submit" id="btnSubmit" class="linkBut​​ton" value="Add">添加项目</button></span>

</fieldset>@{ Html.EndForm();}

Partial Views 非常简单,它们基本上是这样的...

@model Area51.Models.Workflow.AddReportableItemToBatchActionModel<小时/><h3>选择要添加的项目</h3>@Html.EditorFor(x => x.Item)<br/>

同样,如果我只是 RenderPartial,验证工作正常,但是当我尝试通过 ajax 执行它时,验证会消失.重新绑定验证"警报触发,但 $.validator.unobtrusive.parse("#frmAddItem");好像什么都没做.

任何人都可以帮助我解决我所缺少的问题吗?不胜感激.

<======================== 更新 1 ==============================>

好的,我尝试添加 $.validator.unobtrusive.parse("#frmAddItem");在文档就绪事件中部分视图的底部,它似乎也不起作用,基本上没有任何变化,我仍然可以提交表单.

我确实在这里找到了一个帖子:http://xhalent.wordpress.com/2011/01/24/applying-unobtrusive-validation-to-dynamic-content/ 提到当 jqvalidation 的 MVC 版本看到一个表单已经绑定了验证规则时,它只是忽略 .validator 调用.我实现了这位先生使用的脚本扩展,现在验证正在使用新扩展重新绑定到表单.我可以通过将 html 附加到表单并调用新扩展来测试这一点,并且它正在重新绑定到新文本框.

然而,这仍然没有完全解决问题.我使用 Firebug 检查了从 ajax 调用返回的字段的实际内容,并注意到一些非常奇怪的事情.

当我使用 RenderPartial 调用操作时,它会写出以下选择:

"

<select id="Item" name="Item" data-val-required="Item 字段为必填项."" data-val-number="该字段项目必须是一个数字.数据值=真">

但是,当我对相同的控制器操作进行 ajax 调用时,它返回给我:


                
            
            
发送“验证码”获取 | 15天全站免登陆