能否使用命名的JSON属性将复杂对象传递给C#控制器?
当我尝试在JSON对象中分配属性名时,我在Web API控制器上的POST方法参数中填充C#对象时遇到了一些JSON数据问题 这是我的API控制器:能否使用命名的JSON属性将复杂对象传递给C#控制器?,c#,jquery,ajax,asp.net-mvc,api,C#,Jquery,Ajax,Asp.net Mvc,Api,当我尝试在JSON对象中分配属性名时,我在Web API控制器上的POST方法参数中填充C#对象时遇到了一些JSON数据问题 这是我的API控制器: [HttpPost] public HttpResponseMessage MyResource(MyComplexClass myClass) { var test = myClass.Name; return Request.CreateResponse(HttpStatusCode.Created); } 下面是MyCom
[HttpPost]
public HttpResponseMessage MyResource(MyComplexClass myClass)
{
var test = myClass.Name;
return Request.CreateResponse(HttpStatusCode.Created);
}
下面是MyComplexClass的
public class MyComplexClass
{
public string Name { get; set; }
public string Id { get; set; }
}
下面是我的AJAX
调用:
<script>
function test() {
var innerData = {
Name: 'Bob Loblaw',
Id: "1"
};
var myData = {
myClass: innerData
};
$.ajax({
type: "POST",
url: "api/Test/MyResource",
data: JSON.stringify(myData),
contentType: "application/json",
dataType: "json",
success: function (response) {
// do success stuff
},
error: function (err) {
// do error stuff
}
});
}
</script>
与此控制器方法匹配:
public HttpResponseMessage MyResource(string Name, string Id)
为什么这个JSON对象不:
var data = {
Name: 'Bob Loblaw',
Id: "1"
};
var data = {
myClass: { Name: 'Bob Loblaw', Id: "1" }
};
var data = {
myClass: { Name: 'Bob Loblaw', Id: "1" }
};
与此控制器方法匹配吗
public HttpResponseMessage MyResource(MyComplexClass myClass)
public HttpResponseMessage MyResource(MyComplexClass myClass)
附加问题:
是否可以按以下方式声明API方法:
public HttpResponseMessage MyResource(MyComplexClass myClass, string anotherValue)
如果是这样,JSON对象将如何构造?这是因为您嵌套了innerData对象,而C#不知道它是什么。您既不能通过将innerData传递给ajax来嵌套该对象,也不能将另一层嵌套到您的C#对象,如下所示:
public class MyOuterClass
{
public MyComplexClass innerData { get; set; }
}
为什么这个JSON对象不:
var data = {
Name: 'Bob Loblaw',
Id: "1"
};
var data = {
myClass: { Name: 'Bob Loblaw', Id: "1" }
};
var data = {
myClass: { Name: 'Bob Loblaw', Id: "1" }
};
与此控制器方法匹配吗
public HttpResponseMessage MyResource(MyComplexClass myClass)
public HttpResponseMessage MyResource(MyComplexClass myClass)
由于模型绑定在WEB API中的工作方式,当您发送
var data = {
Name: 'Bob Loblaw',
Id: "1"
};
WEB API将发送的json对象的属性绑定到定义为参数的类的属性
那么为了配合,
var data = {
myClass: { Name: 'Bob Loblaw', Id: "1" }
};
MyComplexClass需要定义为
public class MyComplexClass
{
public Object myClass{ get; set; }
}
尝试var myData=innerData
并发送MyComplexClass
需要一个带有两个键的对象;姓名和身份证。但你没有给它。所以它没有任何可映射的对象MyComplexClass
没有将您的输入正确映射到it Web API 2的myClass
字段?不,我正在使用MVC版本5.2.3和类似版本的Web API。我不明白的是,此方法声明:public HttpResponseMessage MyResource(MyComplexClass myClass)
和这个:公共HttpResponseMessageMyResource(字符串名称、字符串Id)
在处理JSON对象时被以相同的方式处理。MVC框架中有什么东西决定了这一点吗?我在我的问题帖子的底部添加了一些额外的措辞,这可能会澄清我的问题。我认为这里缺少的部分可能是json对象的序列化。因此,更进一步:我可以看到这样的Web API方法声明:public HttpResponseMessage吗MyResource(MyComplexClass myClass,string anotherValue)
如果是,JSON对象将如何构造?谢谢你的帮助!人们倾向于使用多个参数(MyComplexClass myClass,string anotherValue),而不是定义一个模型(类),该模型(类)组合了您需要的所有属性。因此,如果MyComplexClass有两个属性,则只需使用这两个属性和一个字符串为资源创建一个新类。在MVC中,它们被称为视图模型,请检查它们,如果您坚持json将是var data={Name:'Bob lobalaw',Id:“1”,另一个值:“Johnny”}将非常感谢!我有点认为多参数的东西是一个糟糕的标准。我提出这个问题的原因是,我正在编写一个自文档化API工具,它允许用户尝试一种方法(基本上是自动生成邮递员表单),并试图预测任何可能导致麻烦的糟糕API设计。。APIController的行为不同于MVC中使用的控制器,为简单起见,它们不直接使用多个对象作为参数,如果要使用多个对象,则必须创建模型绑定器,或者创建具有所需所有属性的统一模型