ASP.Net Web Api,POST多个对象

时间:2017-10-06 16:41:12

标签: angularjs asp.net-mvc asp.net-web-api

我有这个AngularJS Http Call

var sAfter = (index < (_text.length - 1)) ? _text.substr(index + 1,_text.length - index) : "";

Ant这个ASP.net Web Api方法

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

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

是不是在POST方法中将多个对象作为params发送的方式,我宁愿避免修改我的模型,避免为此创建一个类

所以我的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;
  }

3 个答案:

答案 0 :(得分:1)

<强> 1。定义参数模型

<script>
 var trackerName = ga.getAll()[0].get('name');

 ga(trackerName + '.send', 'event', {
  eventCategory: 'Product',
  eventAction: 'Outbound click',
  eventLabel: '<?php echo str_replace("'"," ",$product->pro_label_fr); ?>',
  eventValue: <?php echo intval($product->pro_price * 100); ?>,
  dimension1: '<?php echo Utils::getClientIp(); ?>',
  dimension2: '<?php echo $customer->cus_label; ?>',
  dimension3: '<?php echo date('m/d/Y h:i:s a', time()); ?>',
  dimension4: '<?php echo $category; ?>',
  dimension5: '1',
  dimension6: 'top',
  transport: 'beacon'
});
</script>

<强> 2。使用模型作为API控制器方法的参数

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

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

第3。发布时,数据{}内的对象必须具有与您在Controller方法中定义的参数名称匹配的键

jQuery ajax

// 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)
    {}
}

总结一下,是的,只要

,您就可以将多个对象发回服务器
  1. 您为每个对象定义一个键,该键必须与您在服务器方法上定义的参数名称相匹配。
  2. 对象结构必须匹配。
  3. - 更新 -

    正如一个证据,这是截图:

    enter image description here

答案 1 :(得分:1)

我们有一个使用DefaultHttpBatchHandler接受多部分POST请求的应用。我认为它有点笨拙有很多原因,但它是以结构化方式在单个请求上接受多个对象的内置方式。

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

至于创造某些东西的剧本,我不知道。我们使用此API的调用者是C#服务,可以使用我们提供的简单客户端库来创建多部分请求,以帮助他们实现这一目标。

答案 2 :(得分:0)

“在POST方法中将多个对象作为params发送是我的方法,我宁愿避免修改我的模型,也不要为此创建一个类”

按照设计,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>();
}