【问题标题】:How would you pass objects with MVC and jQuery AJAX?你将如何使用 MVC 和 jQuery AJAX 传递对象?
【发布时间】:2010-04-27 17:25:11
【问题描述】:

经过多年的 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 解析为对象?

【问题讨论】:

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


    【解决方案1】:

    这取决于表单数据的复杂程度。让我们使用一个 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 模型绑定器将表单数据放入这些属性中应该没有问题(其他所有属性都将默认设置)。

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

    【讨论】:

    • 方法有多个参数怎么办?
    • 对于每个参数,MVC 将尝试将任何表单数据绑定到参数本身(如果它是简单类型),或者绑定到该参数的任何属性(如果它是复杂类型)。因此,如果您有两个参数,每个参数都有一个 First 属性,那么两者都应该获得发布到服务器的“First”键中指定的值。如果您希望仅将其绑定到一种复杂类型,还可以使用特定的命名语法。
    • 我有奇怪的结果,这在 FF 中有效,但方法参数后面的代码中的 IE 获取了一个所有字段都初始化为 null 的对象?
    • 当您对代码进行断点时,请检查 Request.Form 集合以查看已发布的密钥。 IE 和 FF 可能不一样。
    【解决方案2】:

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

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

    AJAX calls to ASP.NET MVC action methods using jQuery

    【讨论】:

    • 鲍勃,链接坏了。
    【解决方案3】:

    当您通过 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

    【讨论】:

      【解决方案4】:

      你可以这样做:

       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 对象作为参数,这样您就可以处理所有验证。

      【讨论】:

      • $.ajax 方法允许您异步处理。
      【解决方案5】:

      我猜我是个骗子,并做了以下事情:

              $("#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>
      

      【讨论】:

        猜你喜欢
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 2012-10-25
        • 2019-02-16
        • 2018-09-10
        相关资源
        最近更新 更多