【问题标题】:Ajax.BeginForm unobtrusive ajax not firingAjax.BeginForm 不显眼的 ajax 不触发
【发布时间】:2016-12-14 10:01:39
【问题描述】:

我在局部视图中有一个表单,该表单没有触发 AjaxOptions 中指定的客户端 javascript 方法,我不明白为什么。

我有以下表格。

@model QuickContact

<div id="quickContactForm" class="row">
    <div class="col-md-4 push-md-9 box">

        <h4>Quick Contact</h4>

        <div id="contactForm"></div>

        <p>
            For an instant callback simply fill in the form below.
        </p>

        @using (Ajax.BeginForm(
            "QuickContact",
            "Contact",
            new AjaxOptions
            {
                OnFailure = "contact.onFailure",
                OnBegin = "contatc.onBegin",
                OnComplete = "contact.onComplete",
                OnSuccess = "contact.onSuccess",
                UpdateTargetId = "quickContactForm"
            }))
        {
            @Html.AntiForgeryToken()

            <div class="form-group">
                @Html.EditorFor(x => x.Name, new { htmlAttributes = new { @class = "form-control", placeholder = "Enter your name..." } })
                @Html.ValidationMessageFor(x => x.Name, null, new { @class = "text-danger" })

                @Html.EditorFor(x => x.Telephone, new { htmlAttributes = new { @class = "form-control", placeholder = "Enter your telephone..." } })
                @Html.ValidationMessageFor(x => x.Telephone, null, new { @class = "text-danger" })

                <input type="submit" class="btn btn-block btn-primary" value="Submit" />
            </div>
        }

        <div id="loading" class="row">
            <div class="col-md-12">
                <p class="text-lg-center">
                    <i class="fa fa-spinner" aria-hidden="true"></i>
                </p>
            </div>
        </div>

    </div>
</div>

用我的js是;

var contact = {

    onBegin: function() {
        console.log("loading...");
        $('#loading').show();
    },

    onComplete: function() {
        console.log("complete");
        $("#loading").hide();
    },

    onFailure: function(ajaxContext) {
        console.log("error occured.");
        var response = ajaxContext.responseText;
        alert("Error Code [" + ajaxContext.ErrorCode + "] " + response);
        $('#loading').hide();
    },

    onSuccess: function(result) {
        // enable unobtrusive validation for the contents
        // that was injected into the <div id="result"></div> node
        console.log("ajax success func");
        $.validator.unobtrusive.parse($(result));
    }
};

我还安装了用于 unobtrusive-ajax 的 nuget 包

安装包 Microsoft.jQuery.Unobtrusive.Ajax

在我的 web.config 我有

<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

最后,我将 unobtrusive-ajax 链接添加到我的捆绑包中;

        bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                    "~/Scripts/jquery-{version}.js"));

        bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.unobtrusive-ajax.js",
                    "~/Scripts/jquery.validate*",
                    "~/Scripts/tether/tether.js"));

我没有收到任何控制台错误,但 POST 正在执行控制器操作,并且我的任何 ajax 控制台日志都没有注册。

有什么想法我在这里做错了吗?

【问题讨论】:

    标签: javascript jquery ajax asp.net-mvc-5


    【解决方案1】:

    您的代码看起来不错。只需确保您的 OnBegin 属性值正确。应该是contact.onBegin 而不是contatc.onBegin

    onBegin 函数是在 contact 上定义的,而不是 contatc

    这应该可行。

    @using (Ajax.BeginForm(
                            "QuickContact",
                            "Contact",
                            new AjaxOptions
                            {
                                OnFailure = "contact.onFailure",
                                OnBegin = "contact.onBegin",
                                OnComplete = "contact.onComplete",
                                OnSuccess = "contact.onSuccess",
                                UpdateTargetId = "quickContactForm"
                            }))
    {
      <!-- Your form controls goes here -->
    
    }
    

    我尝试了这段代码,并将消息记录到我的控制台。

    您可能还想包含jquery.validate.unobtrusive.js 库。

    【讨论】:

    • 嗨 Shyju,对不起,这只是我的问题中的一个错字。正如我所提到的,一切似乎都是正确的(顺便说一下,我正在使用 chrome 进行测试并使用 bootstrap v4)。控制台也没有错误,但是js文件需要排序吗?
    • 正如我在答案中提到的,您还需要jquery.validate.unobtrusive.js。那么当你点击提交所有这些代码时发生了什么?您是否在浏览器控制台中看到了 console.log 消息?单击提交时是否有任何错误?上面的代码完全适合我
    猜你喜欢
    • 2014-03-16
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多