2017-10-06 87 views
0

我有这个AngularJS HTTP调用ASP.Net网络API,POST多个对象

$http({ 
     method: "POST", 
     url: Helper.ApiUrl() + '/Api/Case/SendCase', 
     data: { obecttype1, obj2, obj3}, 
       }).then(function mySuccess(response) {}); 

蚂蚁这个ASP.net的Web API方法

[HttpPost] 
[Route("Api/Path/SendCase")] 
public int SendCase(object application) 
{ 

string applicantName = ((Newtonsoft.Json.Linq.JObject)application)["applicant"].ToString(); 

obecttype1 obj = JsonConvert.DeserializeObject<obecttype1>(((Newtonsoft.Json.Linq.JObject)application)["obecttype1"].ToString()); 

    ......................... 
    return ID; 
    } 

这工作得很好,但我觉得这是有点脏因为我解析我在我的方法的对象,所以我的问题是

是的也一路发送多个对象为在P PARAMS OST的方法,我宁愿避免修改我的模型,避免了这

创建一个类,所以我的API方法是这样的

public int SendCase(class1 obecttype1, class2 obj2, class3 obj3) 
+0

如果不创建一个新类来保存'objecttype1','obj2'和'obj3',这不是你可以做的事情。 –

回答

0

“是也一路发送多个对象为在PARAMS POST方法,我宁愿避免修改我的模型,避免为此创建一个类“

通过设计HTTP Post只能有一个主体,web api将尝试将主体转换为方法签名中定义的参数。因此,在正文中发送多个对象并尝试将这些对象与方法签名中的多个参数进行匹配将不起作用。为此,您需要定义一个包含其他类并匹配身体签名的类。

public class postDTO 
{ 
    public class1 class1Data { get; set; } 
    public class2 class2Data { get; set; } 
    public class3 class3Data { get; set; } 
} 

//The api signature 
public int SendCase(postDTO application) 

如果你还不想添加新的类,然后我会用JObject直接作为参数,因为这

[HttpPost] 
public int SendCase(JObject jsonData) 
{ 
    dynamic json = jsonData; 
    JObject class1DataJson = json.class1Data; 
    JObject class2DataJson = json.class2Data; 
    JObject class3DataJson = json.class3Data; 

    var class1Data = class1DataJson.ToObject<class1>(); 
    var class2Data = class2DataJson.ToObject<class2>(); 
    var class3Data = class3DataJson.ToObject<class3>(); 
} 
+0

HTTP Post只能有一个主体,但当您使用Angular Http服务或jQuery Ajax发布多个对象时(对象必须是键值对),它们会被序列化为JSON字符串(如果您不指定内容类型)。然后,当JSON字符串传输到服务器时,ASP.NET Web API将尽力使用模型绑定和媒体类型格式化程序从消息正文中读取值。因此将多个对象放入1个对象中是没有必要的。实际上,我使用{key1:value1,key2,value2}指定对象的方式实际上是单个对象,即匿名对象。 –

+0

这只是我的答案的确认,但我认为这是正确的 –

1

1.定义模型中的参数

public class ClassType1 
{ 
    public int Num1 { get; set; } 
    public string Str1 { get; set; } 
} 

public class ClassType2 
{ 
    public double Test2 { get; set; } 
} 

2.使用模型作为API控制器方法的参数

// Sorry this example is setup on .Net Core 2.0 but I think the previous 
// versions of Web Api would have similar/same behavior 

[Route("api/[controller]")] 
public class ValuesController : Controller 
{ 
    [HttpPost] 
    public void Post(ClassType1 ct1, ClassType2 ct2) 
    {} 
} 

3发布时,你的对象里面的数据{}已经有符合您的控制器方法

jQuery的AJAX定义的参数名称键

 $.ajax({ 
       method: 'post', 
       url: 'http://localhost:53101/api/values', 
       dataType: 'json', 
       data: { 
        // It takes key value pairs 
        ct1: { 
         num1: 1, 
         str1: 'some random string' 
        }, 
        ct2: { 
         test2: 0.34 
        } 
       } 
      }); 

总结,是的,你可以发布多个对象回服务器,只要

  1. 您可以定义为每个对象的关键,关键是T o匹配您在服务器方法中定义的参数名称。
  2. 对象结构必须匹配。

- 更新 -

就像一个证明,这里是截图:

enter image description here

+1

你确定它有效吗? –

+0

它对我的工作很有帮助。我创建了示例并在发布之前先对其进行了测试。我只是不知道这是你从一开始就想要的。既然你已经建立了你的环境,例如Web API和Angular,为什么你不试试并告诉我它是否正常工作。 –

+0

我附上截图以显示它在我的工作... –

1

我们有一个使用DefaultHttpBatchHandler接受多部分的应用POST请求。我相信这有点笨重,原因很多,但它是以结构化方式接受多个对象的内置方式。

https://msdn.microsoft.com/en-us/library/system.web.http.batch.defaulthttpbatchhandler(v=vs.118).aspx

至于脚本创建的东西,我不知道。我们使用此API的调用者是C#服务,它可以使用我们提供的简单客户端库来创建多部分请求,以帮助他们做到这一点。

+0

我会尝试,听起来很有趣 –