gpt4 book ai didi

c# - MVC3 Unobtrusive Validation 在 Ajax 调用后不起作用

转载 作者:IT王子 更新时间:2023-10-29 04:01:51 27 4
gpt4 key购买 nike

好吧,事情是这样的,我在 SO 上看到了一些与此问题相关的帖子,但对我来说没有任何效果。

基本上,我选择了从部分 View 加载的下拉菜单,我试图根据先前选择的下拉菜单过滤每个后续下拉菜单的内容。

如果我只是调用 div 容器中的部分 View ,然后加载页面,数据注释的验证工作正常,主要是 Required 属性

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

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

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

  @model Area51.Models.Workflow.AddReportableItemToBatchActionModel
@{
ViewBag.Title = "Add Reportable Item to Batch";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<script type="text/javascript">

$(function () {
var fadeDelay = 150;

$(".jqDatePicker").datepicker({
dateFormat: 'm/d/yy',
onSelect: function (date) {
$("#categoryContainer").show(fadeDelay);
}
});

$('#Category').change(function () {
RetrieveItemsForCategory();
$("#itemContainer").show(100);
});

$('#Item').live('change', function () {
RenderPartialForUOMByItem();
});



function RetrieveItemsForCategory() {

var category = $("#Category :selected").val();

$.ajax({
type: "POST",

url: '@Url.Action("RenderPartialForLocationItemsByCategory","BatchWorkflow")',

data: 'category=' + category,

success: function (result) {
$("#itemContainer").html(result.toString());
$("#itemContainer").show(100);
RebindValidation();
},

error: function (req, status, error) {
alert("Sorry! Could not request items for your selection at this time.");
}

});


}


function RenderPartialForUOMByItem() {

var item = $("#Item :selected").val();

$.ajax({
type: "POST",

url: '@Url.Action("RenderPartialForUOMByItem","BatchWorkflow")',

data: "item=" + item,

success: function (result) {
$("#quantityContainer").html(result.toString());
$("#quantityContainer").show(100);
RebindValidation();
},

error: function (req, status, error) {
alert("Sorry! Could not request items for your selection at this time.");
}

});
}

function RebindValidation() {
alert("Rebinding Validation");
$.validator.unobtrusive.parse("#frmAddItem");
}

}); // End OnLoad Event
</script>

<h3 class="pageHeader">Batch : @Model.BatchName</h3>

<div align="center">

@{Html.BeginForm("AddItemToBatch", "BatchWorkflow", null, FormMethod.Post, new { id = "frmAddItem" });}

@Html.ValidationSummary(true)

<fieldset style="width:60%">
<legend>Add an Item to the Batch</legend>

<div>
<h3>Select Date Item was Added</h3>
@Html.EditorFor(x => x.EventDate,null)
<br />
</div>

<div id="categoryContainer" style="display:none">
<hr />
<h3>Select an Inventory Category</h3>
@Html.EditorFor(x => x.Category,null)
<br />
</div>

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


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

<div id="reportingDataContainer" style="display:none">
<hr />
<h3>What quantity of the batch was affected by this addition?</h3>
@Html.EditorFor(x => x.ConsumedWineQuantity) (Gallons)
<br />
<hr />
<h3>What was the increase in Batch Volume as a result of this addition?</h3>
@Html.EditorFor(x => x.ProducedWineQuantity) (Gallons)
</div>

<div style="display:block">
<div></div>
<span><button type="button" id="btnCancel" class="linkButton" value="Cancel" onclick="location.href='@Url.Action("Home","Home",null)';">Cancel</button></span>
<span><button type="submit" id="btnSubmit" class="linkButton" value="Add">Add Item</button></span>
</div>


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

分部 View 非常简单,它们基本上看起来像这样......

@model Area51.Models.Workflow.AddReportableItemToBatchActionModel

<hr />
<h3>Select the Item to Add</h3>
@Html.EditorFor(x => x.Item)
<br />

同样,如果我只是 RenderPartial,验证工作正常,但是当我尝试通过 ajax 进行时,验证消失了。 “重新绑定(bind)验证”警报触发,但 $.validator.unobtrusive.parse("#frmAddItem");似乎什么也没做。

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

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

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

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

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

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

<select id="Item" name="Item" data-val-required="The Item field is required." data-val-number="The field Item must be a number." data-val="true">

但是,当我对完全相同的 Controller 操作进行 ajax 调用时,它返回给我:

<select id="Item" name="Item">

我也尝试将脚本标签添加到局部 View ,但没有解决问题。 ajax 调用会剥离不显眼的验证标签有什么原因吗?

<=======================更新 2 ===================== ========>

好的,那么发生了什么,我有一个下拉列表的编辑器模板,它采用一个选择列表并将其转换为一个 html 选择。我发现一篇文章提到为了让数据验证属性写在编辑器模板上,你必须有一个表单上下文。由于 Html.RenderPartial 是在表单中完成的,因此编辑器模板有一个表单上下文可以使用。当我只是试图通过 ajax 调用部分时,没有可以使用的表单上下文,而不是提示它只是没有写出数据验证属性。在 SelectListDropDown 的编辑器模板中添加一个新的 Form Context 解决了这个问题。

@{ // fix to stop stupid crappy brad wilson mvc3 code from stripping the jq data valdiation attributes
if (ViewContext.FormContext == null)
{
ViewContext.FormContext = new FormContext();
}
}

最佳答案

$.validator.unobtrusive.parse("#frmAddItem"); 将起作用。请注意,它必须在您通过ajax加载的部分中(部分中的表单下方)

<form id="frmAddItem" method="POST" action="...">
<!-- all the items -->
</form>
<script type="text/javascript">
$.validator.unobtrusive.parse("#frmAddItem");
</script>

关于c# - MVC3 Unobtrusive Validation 在 Ajax 调用后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7048726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com