Asp.net mvc 不引人注目的验证不';不要使用Ajax.begin

Asp.net mvc 不引人注目的验证不';不要使用Ajax.begin,asp.net-mvc,asp.net-mvc-3,unobtrusive-validation,Asp.net Mvc,Asp.net Mvc 3,Unobtrusive Validation,我在Model1视图中放置了Ajax.BeginForm(),在该视图中,我在Model2视图中放置了Ajax.BeginForm()。因此,只有在第一种形式下才能工作不引人注目的验证。为什么只有第一种形式的工作验证 第一视图 @model Model1 @using (Ajax.BeginForm("Action1","Controller",null,new AjaxOption(){ onSuccess = "alert('=)')"},null) { <intput ty

我在Model1视图中放置了
Ajax.BeginForm()
,在该视图中,我在Model2视图中放置了
Ajax.BeginForm()
。因此,只有在第一种形式下才能工作
不引人注目的验证
。为什么只有第一种形式的工作验证

第一视图

@model Model1

@using (Ajax.BeginForm("Action1","Controller",null,new AjaxOption(){ onSuccess = "alert('=)')"},null)
{

   <intput type="submit" value="Save" />
}


Model2 model2 = new Model2();
@Html.EditorFor(m=>model2)
@Model1模型
@使用(Ajax.BeginForm(“Action1”,“Controller”,null,新的AjaxOption(){onSuccess=“alert('=)”)”},null)
{
}
Model2 Model2=新Model2();
@EditorFor(m=>model2)
**在Model2视图中,我有。**

@model Model2 
@using (Ajax.BeginForm("AddStreet","Controller",new AjaxOption(){onSuccess = "alert('=)'")},option,null)
{

        @Html.LabelFor(m => Model.Name):
        @Html.TextBoxFor(m => Model.Name)
        @Html.ValidationMessageFor(m => Model.Name)

       <intput type="submit" value="Save" />
}
@Model2
@使用(Ajax.BeginForm(“AddStreet”,“Controller”,新的AjaxOption(){onSuccess=“alert('=)”)”)选项,null)
{
@Html.LabelFor(m=>Model.Name):
@Html.TextBoxFor(m=>Model.Name)
@Html.ValidationMessageFor(m=>Model.Name)
}

感谢@Darin Dimitrov的回答。

您必须添加对
jquery.unobtrusive ajax.js的引用才能在
ajax表单中启用验证

@model Model1

@using (Ajax.BeginForm("Action1","Controller",null,new AjaxOption(){ onSuccess = "alert('=)')"},null)
{

   <intput type="submit" value="Save" />
}


Model2 model2 = new Model2();
@Html.EditorFor(m=>model2)
大概是这样的:

<script type="text/javascript" src="/Scripts/jquery.unobtrusive-ajax.js"></script>

这是因为第二个视图在稍后阶段加载了AJAX,您需要调用
$.validator.unobtrusive.parse(…)
在其内容被注入DOM之后立即进行验证,以实现不引人注目的验证。有关更多详细信息,请参阅

因此,在您的情况下,与其在第一个AJAX调用的
OnSuccess
回调中发出警报,不如订阅一个将调用此方法的javascript函数:

@using (Ajax.BeginForm(
    "Action1",
    "Controller",
    null,
    new AjaxOptions { 
        OnSuccess = "onSuccess",
        UpdateTargetId = "result"
    },
    null)
)
{
    <input type="submit" value="Save" />
}
@使用(Ajax.begin)(
“行动1”,
“控制器”,
无效的
新的AjaxOptions{
OnSuccess=“OnSuccess”,
UpdateTargetId=“结果”
},
空)
)
{
}
然后在javascript文件中:

var onSuccess = function(result) {
    // enable unobtrusive validation for the contents
    // that was injected into the <div id="result"></div> node
    $.validator.unobtrusive.parse($(result));
};
var onSuccess=函数(结果){
//对内容启用不引人注目的验证
//这是注入节点的
$.validator.unobtrusive.parse($(结果));
};

您需要在部分视图中添加这两个文件,即使它已经在共享布局.cshtml中:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript" language=javascript>
    $.validator.unobtrusive.parse(document);
</script>

或者将其放入您的部分中:

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript" language=javascript>
    $.validator.unobtrusive.parse(document);
</script>

$.validator.unobtrusive.parse(文档);

这个解决方案最适合我

$.validator.unobtrusive.parse(document);

Darin Dimitrov的回答只有在调用Ajax成功处理程序之前,
jquery验证插件的
validate()
没有被调用时才起作用。我想不出哪种情况会是这样,因此我想知道为什么答案被认为是正确的

也许过去jquery验证代码的更改现在会导致以下问题:

问题是
validate()
首先执行以下行

// Check if a validator for this form was already created
var validator = $.data( this[ 0 ], "validator" );
if ( validator ) {
  return validator;
这意味着在调用validate()时返回验证器对象,而不进一步处理传递的选项

这也意味着以后调用
$.validator.unobtrusive.parse(…)
$.validator.unobtrusive.parseElement(…)
,执行

$form.validate(this.options) <- this.options holds the new rules parsed from HTML
重新验证表单(例如,单击提交)现在应产生预期结果

下面是一个完整的示例,其中还包括已接受答案中的代码:

剃刀

--

另外,还可以使用
rules()
方法手动更新验证器,如

$yourHtmlField.rules( "add", {
  required: true,
  messages: {
    required: "Required input"
  }
});

因为这直接更新了验证器的规则,而没有不引人注目的东西。但是,数据val属性将变得无用。

@Sasha,在View2中,您没有结束字符串
“alert('=)”)
=>
“alert('=)”)“
不是它。。。我无法显示完整的代码。。因为它很大。我想我必须使用I frame并在frame中显示View2。@Sasha,在第二个表单中,除了提交按钮外,您似乎没有任何要发布的输入字段。因此,在提交表单时,您没有向服务器发送任何内容。。。和X-request-with尝试将
@Html.TextBoxFor(m=>Model.Name)
替换为
@Html.TextBoxFor(m=>m.Name)
。标签和验证也是一样。Ajax.BeginForm仍在调用post操作方法。大家好,我做了与Darin回答相同的事情,仍然不起作用。请帮忙。在我的例子中还有一件事,我在模态弹出窗口(bootstrap modal.js)中呈现局部视图,为什么需要同时在布局和局部视图上显示它们呢?这是因为验证不起作用,速记方法:再次调用它。。有效但无效ideal@dperez,我将您的解决方案添加到我的代码中,我的工作非常完美,但现在每次都会出现一个恼人的js错误“TypeError:owner is undefined”。有解决方案吗?我以前做过,但我相信当我将jquery.validate.unobtrusive.js添加到_布局和局部视图中时,表单提交了两次。你能给出一个完整的例子吗?这样我们就不必将解决方案的不同部分拼接在一起了?@Pangamma done,我基本上只是指Darin Dimitrov的回答。