你将如何使用MVC和jQuery AJAX传递对象?

时间:2010-04-27 17:25:12

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

经过多年的asp.net,我终于尝试并尝试学习MVC 我习惯使用asp.net AJAX PageMethods,你可以将一个自动解析的对象传递给该方法中参数的任何类型。

使用Javascript:

PageMethods.AddPerson({First:"John",Last:"Doe"});

代码隐藏:

[WebMethod]
public static Result AddPerson(Person objPerson)
{
    return Person.Save();
}

如何使用MVC和jQuery呢? 是否必须发送字符串并将json解析为对象?

5 个答案:

答案 0 :(得分:4)

这取决于您的表单数据的复杂程度。让我们使用一个jQuery示例:

$.ajax({
    url: '\Persons\AddPerson', // PersonsController, AddPerson Action
    data: { First: "John", Last: "Doe" },
    type: 'POST',
    success: function(data, status)
    {
        alert('Method called successfully!');
    }
});

所以我们发布了两个数据。如果Person类有两个名为'First'和'Last'的属性,那么默认的ASP.NET MVC Model Binder应该没有问题将这个表单数据放入这些属性中(其他一切都将被默认)。

当然,您总是可以为Person类型创建一个自定义模型绑定器,然后您可以获取所需的任何表单值,并将它们放入任何属性中,或者调用其他类型的逻辑。

答案 1 :(得分:2)

我有一篇文章介绍了对ASP.NET MVC操作方法的AJAX调用。它涵盖以下组合:

  • HTTP GET,POST
  • jQuery方法$ .get,$ .getJSON,$。postt
  • 将参数发送到操作方法
  • 从操作方法
  • 返回参数(字符串和JSON)
  • 发布表单数据
  • 通过AJAX加载MVC局部视图

AJAX calls to ASP.NET MVC action methods using jQuery

答案 2 :(得分:0)

当您通过ajax将表单发布到控制器上的操作方法时,ModelBinder体系结构会将所发布的表单值解析为业务对象。您可以通过几种不同的方式利用模型绑定。

public ActionResult MyAction(MyObject obj)
{
}

在上面的示例中,modelbinder隐式尝试根据请求中收到的信息创建MyObject

public ActionResult MyAction(FormCollection stuff)
{
   MyObject obj = new MyObject();
   TryUpdateModel(obj);
}

这里我们明确地尝试将发布的表单数据绑定到我们创建的对象。 ModelBinder将尝试将发布的值与对象的属性进行匹配。

在上述任何一种情况下,您都可以查询ModelState对象,以查看在将过帐值转换为对象期间是否发生任何错误。

有关模型绑定的介绍,see here

对于列表和词典的高级模型绑定,see Phil Haack's post

答案 3 :(得分:0)

你可以这样做:

 var person = {};
 person["First"] = $("#FirstName").val();
 person["Last"] = $("#LastName").val();

 $.ajax({
      type: "POST",
      contentType: "application/json; charset=utf-8",
      url: "/Admin/AddPerson",
      data: JSON.stringify(person),
      dataType: "json",
      success: function(result) {

      },
      error: function(result) {

      }
 });

然后在您的管理员控制器上:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult AddRelease(Person p)
{
    // Code to add person            

}

JSON.stringify方法可从here获得。您也可以使用模型而不是Person对象作为参数,以便您可以处理所有验证。

答案 4 :(得分:0)

我想我是骗子,并做以下事情:

        $("#ProgressDialog").dialog({
            autoOpen: false,
            draggable: false,
            modal: true,
            resizable: false,
            title: "Loading",
            closeOnEscape: false//,

            //  open: function () { $(".ui-dialog-titlebar-close").hide(); } // Hide close button
        });
       $("form").live("submit", function (event) {
                event.preventDefault();
                var form = $(this);
                $("#ProgressDialog").dialog("open");
                $.ajax({
                    url: form.attr('action'),
                    type: "POST",
                    data: form.serialize(),//USE THIS to autoserialize!
                    success: function (data) {
                        $("#dialog").dialog({height:0});
                    },
                    error: function (jqXhr, textStatus, errorThrown) {
                        alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
                    },
                    complete: function () {
                        $("#ProgressDialog").dialog("close");

                    }
                });
            });
        });

<div id="ProgressDialog" style="text-align: center; padding: 50px;">
    <img src="@Url.Content("~/Content/ajax-loader.gif")" width="128" height="15" alt="Loading" />
</div>