为什么';IsAjaxRequest()是否在ASP.NETMVC3中工作?

为什么';IsAjaxRequest()是否在ASP.NETMVC3中工作?,asp.net,ajax,json,asp.net-mvc-3,razor,Asp.net,Ajax,Json,Asp.net Mvc 3,Razor,我正在创建一个新项目,asp.net mvc3 with Razor,并希望将登录转换为ajax请求 HTML 控制器 if (Request.IsAjaxRequest()) { return Json(new { ResultMessage = "Username or password provided is incorrect"}); } else { ModelState.AddModelError("", "The user name or password prov

我正在创建一个新项目,asp.net mvc3 with Razor,并希望将登录转换为ajax请求

HTML

控制器

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();
        }
    }
@使用(Ajax.BeginForm(“提交”、“主页”、新的AjaxOptions{HttpMethod=“Post”、OnSuccess=“LoginSubmitted”}))
{
}
@科长
{
功能登录提交(res){
警报(res.Message);
}   
}
公共操作结果提交(字符串id)
{
if(Request.IsAjaxRequest())
{
返回Json(新的{Message=“Logged In”});
}
其他的
{
返回视图();
}
}
以我自己创作的形式,使用标准帮助器可以很好地工作


发生了什么事?

这是因为默认情况下,ASP.NET MVC 3使用jQuery和不引人注目的AJAX,而不是MicrosoftJax*库。这意味着在编写
Ajax.BeginForm
时,需要在页面中包含适当的脚本:

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
然后使用以下命令对该表单进行AJAXify:


是的,当你创建一个MVC应用程序时,它们都是标准的days@Rob埃利斯,不,他们不是<创建新应用程序时,页面中不包括code>jquery.unobtrusive ajax.js。它位于
Scripts
文件夹中,但不包括在内,这意味着没有任何东西可以AJAXify您的
Ajax.beginnotify
helper,因此它只发送一个正常的HTTP请求。顺便说一句,你应该看看你是否使用了FireBug。嗨,达林,我查过了,它们都在那里。我可以查看源代码并单击javascript文件,然后接收它们的内容。我也检查了web.config中的值,它也在那里。@Rob Ellis,好的,当你使用Ajax.begin时,不引人注目的助手不会在成功回调中自动将结果解析为JSON对象:-)你需要自己做这件事。还请注意,在表单中使用
X-request-with
添加一个隐藏字段似乎是一种可怕的黑客行为。如果请求确实是AJAX,或者出现一些javascript错误,请尝试使用FireBug进行查找。Fiddler不擅长这一点,因为您只看到HTTP请求,但无法真正发挥作用。哈哈,好吧,好吧:-)我在登录控件之外编写了一个简单的表单(我已将代码添加到我的问题中),它与ajax帮助器配合得很好。我就是不明白为什么登录示例中没有呈现JSON!
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
@using (Html.BeginForm("LogOn", "Account"))
{
}
$(function() {
    $('form').ajaxForm(function(result) {
        alert('form successfully submitted');
    });
});