.Net Ajax BeginForm回调未被触发

时间:2013-02-16 14:47:10

标签: asp.net-mvc unobtrusive-validation

更新2:

jQuery版本兼容性问题。

更新1:

我的脚本参考中有一个拼写错误。但是我现在遇到这个问题:

TypeError: $(...).live is not a function

$("a[data-ajax=true]").live("click", function (evt) {

=====================================

当我通过ajax.beginform提交有效表单时,在控制器中,它返回JSON,它显示在视图中而不是由回调函数处理,我无法理解为什么会这样。

我从网上拿了一个演示项目,以防万一看起来很熟悉。

HTML / JS

@model Unobtrusive_Validation.Models.BlogPost

<html>
    <head>
    </head>
    <body>
        <script src="~/Scripts/jquery-1.9.1.js"></script>
        <script src="~/Scripts/jquery.validate.js"></script>
        <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
        <script src="~/Scripts/jquery.unobtrusive.ajax.js"></script>

        @using (Ajax.BeginForm("Test", "BlogPost",
            new AjaxOptions{
                HttpMethod = "POST",
                OnSuccess = "OnSuccess",
                OnBegin = "alert('OnBegin')",
                OnComplete = "alert('OnComplete')",
                OnFailure = "alert('OnFailure')"
            } )
        )
        {
            @Html.ValidationSummary(true)

            <fieldset>
                <legend>BlogPost</legend>

                <div class="editor-label">
                    @Html.LabelFor(model => model.PostedOn)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.PostedOn)
                    @Html.ValidationMessageFor(model => model.PostedOn)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.Title)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Title)
                    @Html.ValidationMessageFor(model => model.Title)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.Content)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Content)
                    @Html.ValidationMessageFor(model => model.Content)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.Category)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.Category)
                    @Html.ValidationMessageFor(model => model.Category)
                </div>

                <p>
                    <input type="submit" value="Create" />
                </p>
            </fieldset>
        }
    </body>

    <script type='text/javascript'>
        function OnSuccess(result) {
            console.log(result);
            if (result.success == false) {
                alert("failed");
            }
        }
    </script>
</html>

控制器:

public class BlogPostController : Controller
{
    // GET: /BlogPost/Create

    public ActionResult Create()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Test(BlogPost _model)
    {
        return Json(new {success = false} );
    }
}

的Web.config

<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />

2 个答案:

答案 0 :(得分:6)

<script src="~/Scripts/jquery.unobtrusive.ajax.js"></script>

应该是:

<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>

如果您使用了诸如FireBug或Chrome Developer工具栏之类的javascript调试工具,并查看了“网络”标签,那么当浏览器尝试检索由于您的拼写错误而指定的不存在的文件时,您会立即看到404错误

我还建议您将所有javascript文件放在DOM的末尾,就在结束</body>标记之前。

故事的道德:使用javascript调试工具,如FireBug或Chrome开发人员工具栏。我不可能想象一个人在没有使用这样的工具的情况下进行Web开发。


更新:

还要记住,在jQuery 1.9中,.live() method has been removed是一个重大变化。不幸的是,ASP.NET MVC的unobtrusive-ajax脚本依赖于这个功能。因此,如果你想在MVC中使用一些不显眼的javascript功能,你可能需要使用旧版本的jQuery。

答案 1 :(得分:0)

jquery.unobtrusive-ajax.js
与更高版本的jquery 1.9+不兼容

要使用此功能,请添加jquery-migrate:将旧的jQuery代码迁移到jQuery 1.9+ js文件

<script src="http://code.jquery.com/jquery-1.9.0.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.js"<</script>

可以节省您的时间。

了解更多细节。 http://www.learnsharecorner.com/ajax-begin-form-onsuccess-is-not-working-asp-net-mvc/