【问题标题】:Why doesn't Request.IsAjaxRequest() work in ASP.NET MVC 3?为什么 Request.IsAjaxRequest() 在 ASP.NET MVC 3 中不起作用?
【发布时间】:2011-03-02 07:21:55
【问题描述】:

我正在使用 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 文档来将 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();
        }
    }

我自己创造的一种形式,使用标准助手可以正常工作。

发生了什么事?

【问题讨论】:

    标签: asp.net ajax json asp.net-mvc-3 razor


    【解决方案1】:

    这是因为默认情况下 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 form plugin 对该表单进行 AJAX 化:

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

    【讨论】:

    • 是的,当你现在创建 MVC 应用程序时,它们都是标准配置
    • @Rob Ellis,不,他们不是。当您创建新应用程序时,jquery.unobtrusive-ajax.js 不会包含在您的页面中。它在Scripts 文件夹中,但不包括在内,这意味着没有任何东西可以AJAXify 你的Ajax.BeginForm 助手,因此它只是发送一个正常的HTTP 请求。顺便说一下,如果您使用过 FireBug,您应该已经知道了。
    • 嗨达林,我已经检查过了,他们都在那里。我可以查看源代码并单击 javascript 文件并接收它们的内容。我也检查了 web.config 的值,它也在那里。
    • @Rob Ellis,好的,当您使用 Ajax.BeginForm 时,不显眼的助手不会在成功回调中将结果自动解析为 JSON 对象 :-) 您需要自己执行此操作。另请注意,使用X-Requested-With 在表单中添加隐藏字段似乎是一种可怕的黑客行为。如果请求确实是 AJAX 或者您收到一些 javascript 错误,请尝试使用 FireBug 查找。 Fiddler 不擅长这一点,因为您只看到一个 HTTP 请求,但无法真正发挥作用。
    • 大声笑,好的,好的 :-) 我在登录控件之外编写了一个简单的表单(我已将代码添加到我的问题中),它适用于 ajax 助手。我只是想不通为什么 JSON 没有在 LogOn 示例中呈现!
    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 2014-03-18
    • 2016-03-23
    • 2014-12-16
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多