我正在使用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对象,它没有被解析,而谷歌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();
}
}
以我自己创作的形式,使用标准助手工作正常。
发生了什么事?
答案 0 :(得分: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"))
{
}
对此表单进行AJAX化
$(function() {
$('form').ajaxForm(function(result) {
alert('form successfully submitted');
});
});