我试图理解JsonResult和Ajax.BeginForm之间的区别吗?有人能够善待每个人的例子吗?每个功能都可以由JQuery完成吗?如果是这样,怎么样?
由于
答案 0 :(得分:11)
JsonResult
只是一种ActionResult
派生类,表示此操作将返回JSON而不是视图或其他内容。
例如:
public ActionResult Foo()
{
var model = new MyViewModel
{
Foo = "bar"
};
return Json(model);
}
此控制器操作在调用时返回模型的JSON序列化表示形式:
{"Foo":"bar"}
除此之外,它还将Content-Type
HTTP响应标头设置为application/json
。
Ajax.BeginForm
是一个HTML助手,用于生成<form>
元素但将使用AJAX提交给服务器。因此,如果您将此表单指向返回JSON的控制器操作,您将能够在成功回调中检索此JSON的结果。结果将自动解析为可以访问其属性的javascript对象。
例如:
@using (Ajax.BeginForm("foo", "home", new AjaxOptions { OnSuccess = "onSuccess" }))
{
@Html.EditorFor(x => x.SomeProperty)
<button type="submit">OK</button>
}
这将生成<form>
元素,该元素将在提交到Foo
操作时发送AJAX请求。为此,您需要在页面中包含以下脚本:
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
现在剩下的就是编写这个onSuccess
javascript函数并处理服务器返回的JSON结果:
<script type="text/javascript">
var onSuccess = function(result) {
alert(result.Foo);
};
</script>
每个人的功能可以由JQuery完成吗?
在包含jquery.unobtrusive-ajax.js
的幕后,使用Ajax.*
帮助程序生成的所有表单或链接将自动使用jQuery进行解析和AJAX化。这些帮助程序生成的HTML5 data-*
属性将被处理并转换为AJAX调用。
你当然可以决定使用普通的jQuery而不是Ajax.*
助手。在这种情况下,您不需要包含jquery.unobtrusive-ajax.js
脚本。您不需要使用任何Ajax。*帮助程序。
要生成表单,您可以使用普通的Html.BeginForm
帮助程序:
@using (Html.BeginForm("foo", "home", FormMethod.Post, new { id = "myform" }))
{
@Html.EditorFor(x => x.SomeProperty)
<button type="submit">OK</button>
}
然后在javascript文件中使用jQuery订阅此表单的.submit
事件,通过返回false并发送AJAX请求来取消默认的同步提交:
$(function() {
$('#myform').submit(function(){
$.ajax({
url: this.action,
type: this.method,
data: $(this).serialize(),
success: function(result) {
alert(result.Foo);
}
});
return false;
});
});