为什么在ASP.NET MVC 3中,Request.IsAjaxRequest()无法正常工作?

4
我将创建一个新项目,使用Razor的asp.net mvc3,并希望将LogOn转换为ajax请求。
HTML
@using (Ajax.BeginForm("LogOn", "Account", new AjaxOptions { HttpMethod="post", OnSuccess="LoginSubmitted"}))
{
}

控制器

if (Request.IsAjaxRequest())
{
    return Json(new { ResultMessage = "Username or password provided is incorrect"});
}
else
{
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
}

其它的内容保持不变。

首先,通过使用Fiddler查看http响应,我发现没有x-requested-with头信息。因此我添加了

<input type="hidden" name="X-Requested-With" value="XMLHttpRequest" />

看起来这个方法可以用,但现在我收到的是一个Json对象,而不是被解析过的。Google Chrome只是将Json作为application/json文档发送回屏幕进行呈现。所有的脚本都已经准备好了。

我也尝试了以下操作:

@using (Ajax.BeginForm("Submit", "home", new AjaxOptions { HttpMethod = "Post", OnSuccess="LoginSubmitted"}))
{
}


@section head
{
    <script type="text/javascript">
        function LoginSubmitted(res) {
            alert(res.Message);
        }   
    </script>
}


    public ActionResult Submit(string id)
    {
        if (Request.IsAjaxRequest())
        {
            return Json(new { Message = "Logged In" } );
        }
        else
        {
            return View();
        }
    }

在我自己创建的表单中,使用标准辅助工具可以很好地运作。
发生了什么?
1个回答

8

这是因为ASP.NET MVC 3默认使用jQuery和不显眼的AJAX,而不是MicrosoftAjax*库。这意味着当您编写Ajax.BeginForm时,您需要在页面中包含正确的脚本:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>

并且在您的web.config中,请确保您已启用不显眼的JavaScript:

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

如果你的页面中有任何MicrosoftAjax*脚本引用,现在可以安全地将其丢弃,因为它们已不再使用。

话虽如此,就我个人而言,我从未使用过任何Ajax.*帮助类。我总是更喜欢拥有控制权。所以我会这样写:

@using (Html.BeginForm("LogOn", "Account"))
{
}

然后使用jQuery表单插件将此表单AJAX化:

$(function() {
    $('form').ajaxForm(function(result) {
        alert('form successfully submitted');
    });
});

是的,当你创建一个MVC应用程序时,这些都是标准的。 - Rob
@Rob Ellis,不是的。当您创建新应用程序时,jquery.unobtrusive-ajax.js不会包含在页面中。它在Scripts文件夹中,但未被包含,这意味着没有任何东西可以将您的Ajax.BeginForm助手转换为AJAX,因此它只会发送普通的HTTP请求。顺便说一下,如果您使用FireBug,您应该已经看到了。 - Darin Dimitrov
1
嗨Darin,我已经检查过了,它们都在那里。我可以查看源代码并单击JavaScript文件以接收它们的内容。我也检查了web.config的值,它也在那里。 - Rob
@Rob Ellis,好的,当您使用Ajax.BeginForm时,非侵入式帮助程序不会自动将结果解析为JSON对象在成功回调中 :-) 您需要自己完成此操作。还要注意,在表单内添加一个带有X-Requested-With的隐藏字段似乎是一个可怕的hack。如果请求确实是AJAX或者您遇到了一些JavaScript错误,请尝试使用FireBug查看。Fiddler在这方面并不好,因为您只能看到HTTP请求,但无法真正区分它们。 - Darin Dimitrov
哈哈,好的,好的 :-) 我已经写了一个简单的表单,放在登录控件之外(我已经将代码添加到我的问题中),使用ajax助手可以正常工作。我只是想不通为什么LogOn示例中的JSON没有被渲染出来! - Rob
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接