JsonResult& ajax.BeginForm

时间:2012-02-28 20:27:38

标签: jquery asp.net-mvc asp.net-mvc-3

我试图理解JsonResult和Ajax.BeginForm之间的区别吗?有人能够善待每个人的例子吗?每个功能都可以由JQuery完成吗?如果是这样,怎么样?

由于

1 个答案:

答案 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;
    });
});