2

嗨,
任何人都知道我在这里做错了什么。我正在尝试使用 jQuery AJAX 将 JSON 对象发布到 ASP.Net WebMethod。

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

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

这是快速观看的屏幕截图; json 对象不是简单的对象,而是作为字典出现

这是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
      }
}

4

2 回答 2

2

我最近才处理过这种情况。如果您像我一样设置不创建 DTO 类,这是我的解决方案。

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;
  .....
}
于 2015-07-16T00:49:04.013 回答
1

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

您可以使用Visual Studio 的“将 JSON 粘贴为类”来快速/轻松地创建这些类。

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

于 2015-07-14T16:52:02.143 回答