【问题标题】:Validation does not work on dynamically loaded form via Ajax验证不适用于通过 Ajax 动态加载的表单
【发布时间】:2012-01-09 15:22:05
【问题描述】:

在 MVC 3.0 中以及我在何时何地禁用了不显眼的 javascript:

<key="UnobtrusiveJavaScriptEnabled" value="false" />

如果我通过 jQuery ajax 加载表单,验证不起作用!确实,以下代码返回 null :

alert(Sys.Mvc.FormContext.getValidationForForm($(this).closest('form')[0]));

我知道启用不显眼时的解决方案(通过调用 $.validator.unobtrusive.parse(id); ) 但是当它被禁用时我该怎么办??

【问题讨论】:

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


    【解决方案1】:

    确保您也拨打了Sys.Mvc.FormContext._Application_Load();

    举个例子吧。

    查看模型:

    public class MyViewModel
    {
        [Required]
        public string Foo { get; set; }
    }
    

    控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Create()
        {
            return PartialView(new MyViewModel());
        }
    
        [HttpPost]
        public ActionResult Create(MyViewModel model)
        {
            return Content("thanks for submitting");
        }
    }
    

    查看(Index.cshtml):

    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script>
    <script type="text/javascript">
        $.get('@Url.Action("create")', function (result) {
            $('#foo').html(result);
    
            // That's the important bit that you were probably missing
            Sys.Mvc.FormContext._Application_Load();
    
            $('form').submit(function () {
                if (Sys.Mvc.FormContext.getValidationForForm(this).validate('submit').length > 0) {
                    return false;
                }
            });
        });
    </script>
    
    <div id="foo"></div>
    

    包含动态加载的表单的部分 (Create.cshtml):

    @model MyViewModel
    
    @{Html.EnableClientValidation(true);}
    @using (Html.BeginForm())
    {
        @Html.LabelFor(x => x.Foo)
        @Html.EditorFor(x => x.Foo)
        @Html.ValidationMessageFor(x => x.Foo)
        <button type="submit">OK</button>
    }
    

    备注:显然,这个答案只有在你想使用完全过时的 Microsoft*.js 脚本而不是推荐的 jQuery unobtrusive 和 jQuery validate 插件时才有效。因此,只有在 web.config 中设置 &lt;add key="UnobtrusiveJavaScriptEnabled" value="false"/&gt; 时它才有效。

    【讨论】:

    • 我添加了 Sys.Mvc.FormContext._Application_Load();到页面,它运行没有任何错误,但没有任何改变!当到达 Sys.Mvc.FormContext.getValidationForForm(this) 时,它返回“Uncaught TypeError: Cannot call method 'validate' of undefined”
    • @MahmoudMoravej,我不知道您没有显示您的代码,因此很难诊断问题。我为您提供了一个完整的工作示例。
    • 也许问题是因为我在“index.cshtml”页面中有另一种形式。无论如何,我不明白我可以通过调用 Html.EnableUnobtrusiveJavaScript(true) 为单个页面启用不显眼!所以我改变了策略,只对当前页面使用不显眼的 javascript!...
    【解决方案2】:

    我不知道您为什么要关闭验证而只手动进行。 无论如何,您的问题是,当您关闭不显眼的验证时,asp.net 助手不会输出验证函数使用的数据属性。

    我的建议是离开 &lt;key="UnobtrusiveJavaScriptEnabled" value="false" /&gt; 并取消注册 jQuery 事件。

    【讨论】:

    • 因为一些问题我无法打开不显眼的。那么没有它的解决方案是什么?
    • 自己写,从头开始。
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多