【问题标题】:Unobtrusive validation doesn't work with Ajax.BeginForm不显眼的验证不适用于 Ajax.BeginForm
【发布时间】:2012-01-19 14:40:26
【问题描述】:

我有带有 Model1 的 View,我在其中放置了 Ajax.BeginForm(),在这个 View 中,我有带有 Model2 的 PartialView,我在其中放置了 Ajax.BeginForm()。所以只有在第一种形式工作unobtrusive validation。为什么只在第一种形式工作验证?

第一次查看

@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)

**在 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" />
}

感谢@Darin Dimitrov 的回答。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 unobtrusive-validation


    【解决方案1】:

    那是因为第二个视图在后期加载了AJAX,你需要调用$.validator.unobtrusive.parse(...) 在其内容被注入 DOM 后立即进行,以启用不显眼的验证。查看following blog post了解更多详情。

    因此,在您的情况下,不是在第一个 AJAX 调用的 OnSuccess 回调中 alerting,而是订阅将调用此方法的 javascript 函数:

    @using (Ajax.BeginForm(
        "Action1",
        "Controller",
        null,
        new AjaxOptions { 
            OnSuccess = "onSuccess",
            UpdateTargetId = "result"
        },
        null)
    )
    {
        <input type="submit" value="Save" />
    }
    

    然后在你的 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));
    };
    

    【讨论】:

    • @Sasha,在您的第二种形式中,除了提交按钮之外,您似乎没有包含任何要发布的输入字段。因此,提交表单时,您不会向服务器发送任何内容。
    • 在行动中我采取了 model2.Name ... 和 X-Requested-With
    • 尝试将@Html.TextBoxFor(m =&gt; Model.Name) 替换为@Html.TextBoxFor(m =&gt; m.Name)。标签和验证相同。
    • Ajax.BeginForm 仍在调用 post 操作方法。
    • 大家好,我和达林回答的一样,但还是不行。请提供任何帮助。在我的情况下,我在模态弹出窗口中呈现部分视图(bootstrap-modal.js)
    【解决方案2】:

    您需要在 Partial View 中添加这两个文件,即使它已经在 Shared/_Layout.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>
    

    或者把它放在你的Partial中:

    <script type="text/javascript" language=javascript>
        $.validator.unobtrusive.parse(document);
    </script>
    

    【讨论】:

    • 为什么要同时放在 Layout 和 PartialView 上?
    • 它是因为验证不起作用,速记方法:再次调用它..有效但不理想
    • @dperez ,我将您的解决方案添加到我的代码中,并且我工作得很好,但是现在每次都会弹出一个烦人的 js 错误“TypeError:所有者未定义”。有什么解决办法吗?
    • 我以前做过,但是我相信当我将 jquery.validate.unobtrusive.js 添加到 _Layout 和局部视图时,表单被提交了两次。
    【解决方案3】:

    Darin Dimitrov 的答案仅在调用 Ajax 成功处理程序之前未调用 jquery validate pluginvalidate() 时有效。我想不出可能会出现这种情况的情况,因此我想知道为什么答案被认为是正确的。

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

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

    // Check if a validator for this form was already created
    var validator = $.data( this[ 0 ], "validator" );
    if ( validator ) {
      return validator;
    

    这意味着当调用 validate() 时返回 validator 对象,并且没有传递选项的进一步处理

    这也意味着稍后对 $.validator.unobtrusive.parse(...)$.validator.unobtrusive.parseElement(...) 的调用会执行一个

    $form.validate(this.options) <- this.options holds the new rules parsed from HTML
    

    更新验证器的选项没有效果,因为选项根本没有被处理。

    这里的解决方案是像手动更新验证器

    var $htmlCode = $("your html");
    
    $.validator.unobtrusive.parse($htmlCode, true); // true means no validate() call
    
    // now get the validation info collected in parse()
    var validationInfo = $form.data("unobtrusiveValidation"); 
    
    var $validator = $form.validate(); // get validator and ...
    $validator.settings.rules = validationInfo.options.rules; // ... update its rules
    $validator.settings.messages = validationInfo.options.messages; // ... update its messages
    

    现在重新验证表单(例如单击提交)应该会产生预期的结果。

    这是一个完整的示例,女巫还包括来自已接受答案的代码:

    剃须刀

    @using (Ajax.BeginForm(
        "Action1",
        "Controller",
        null,
        new AjaxOptions { 
            OnSuccess = "onSuccess",
            UpdateTargetId = "result"
        },
        null)
    )
    {
        <input type="submit" value="Save" />
    }
    

    Javascript

    var onSuccess = function(result) {
        var $htmlCode = $(result);
    
        $.validator.unobtrusive.parse($htmlCode, true); // true means no validate() call
    
        // now get the validation info collected in parse()
        var validationInfo = $form.data("unobtrusiveValidation"); 
    
        var $validator = $form.validate(); // get validator and ...
        $validator.settings.rules = validationInfo.options.rules; // ... update its rules
        $validator.settings.messages = validationInfo.options.messages; // ... update its messages
    };
    

    --

    附带说明,也可以使用 rules() 方法手动更新验证器,例如

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

    因为这直接更新了验证器的规则,而没有不显眼的东西。但随后 data-val 属性变得无用。

    【讨论】:

    • 您能否为此提供一个完整的示例,这样我们就不必将您的解决方案的不同部分拼接在一起?
    • @Pangamma Done,我基本上只是指Darin Dimitrov的答案。
    【解决方案4】:

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

    类似这样的:

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

    【讨论】:

    • @Sasha,在 View2 中你没有结束字符串 "alert('=)') => "alert('=)')"
    • 不是...我无法显示完整的代码...因为它很大。我认为我必须使用 i 框架并在框架中显示 View2。
    【解决方案5】:

    这个解决方案最适合我。

    $.validator.unobtrusive.parse(document);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2013-09-21
      • 2016-12-14
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多