jQuery AJAX POST 对象 ASP.Net WebMethod 具有动态数据类型

jQuery AJAX POST object to ASP.Net WebMethod having dynamic datattypes

嗨,
任何人都知道我在这里做错了什么。我试着 POST JSON 使用 jQuery AJAX 反对 ASP.Net WebMethod。

虽然我在服务器端获取对象但不是我的方式 通缉。我希望客户对象是一个简单的对象,这样我就可以像普通实例一样访问,例如customer.Name,但我不能,因为它作为字典对象到达那里。

编辑:: 为什么 JSON 作为 C# 动态类型的字典对象进入服务器端?

这是快速观看的截屏视频;

这是 javascript 和服务器端代码。

 function SaveCustomer() {
  var funcParams = JSON.stringify({
    customer: {
      Name: "Name of Customer",
      Title: "President"
    },
    address: {
      Street: "Street",
      City: "",
      Zip: ""
    }
  });

// 我尝试使用以下 json 参数,但结果仍然相同。

var funcParams = "{\"customer\":" + JSON.stringify({ Name: "Name of
 Customer", Title: "President" }) + ",\"address\":" + 
JSON.stringify({ Street: "Street", City: "", Zip: "" }) + "}";
}

 $.ajax({ type: "POST", contentType: "application/json; charset=utf-8",
 dataType: "json", url: "aspxPage.aspx/SaveCustomer", data: funcParams,
 success: function(){  }, error: function(e){alert("Error occured"+e);} 
 })


[WebMethod(EnableSession = true)]
public static string SaveCustomer(dynamic customer, dynamic address)
{
     if(!string.IsNullOrEmpty(customer.Name) && 
         !string.IsNullOrEmpty(customer.Title)....)
      {
           //app logic
      }
}

我的建议是创建 DTO 对象以匹配 JSON,然后将您的方法参数更改为 Customer 和 Address 类型,而不是动态类型。像这样,例如:http://encosia.com/using-complex-types-to-make-calling-services-less-complex/

您可以使用 Visual Studio's "Paste JSON as Classes" 来创建那些 类 也非常 quick/easy。

如果您出于某种原因绝对不能使用专用 DTO 类,请尝试使用 ExpandoObject 作为参数类型而不是 dynamic。自从我使用它以来已经有很长一段时间了,我不记得它们是否在 WebMethods 中正确反序列化,但我认为它们做到了。只需了解与常规 DTO POCO 相比,动态方法会导致性能下降。

我最近刚处理过这种情况。这是我的解决方案,如果你像我一样不想创建 DTO class.

1) 将序列化的 JSON 字符串传递给 WebMethod

$.ajax({ type: "POST", contentType: "application/json; charset=utf-8",
 dataType: "json", url: "aspxPage.aspx/SaveCustomer", data: "{data: '" + funcParams + "'}",
 success: function(){  }, error: function(e){alert("Error occured"+e);} 
 })

2) 使用 JSON.NET 反序列化字符串,一切顺利。

[WebMethod(EnableSession = true)]
public static string SaveCustomer(string data)
{
   dynamic customer = JsonConvert.DeserializeObject(data);
   customer.Name;
   customer.Address;
  .....
}