Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
能否使用命名的JSON属性将复杂对象传递给C#控制器?_C#_Jquery_Ajax_Asp.net Mvc_Api - Fatal编程技术网

能否使用命名的JSON属性将复杂对象传递给C#控制器?

能否使用命名的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

当我尝试在JSON对象中分配属性名时,我在Web API控制器上的POST方法参数中填充C#对象时遇到了一些JSON数据问题

这是我的API控制器:

[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中使用的控制器,为简单起见,它们不直接使用多个对象作为参数,如果要使用多个对象,则必须创建模型绑定器,或者创建具有所需所有属性的统一模型