【问题标题】:How to receive dynamic data in Web API controller Post method如何在 Web API 控制器 Post 方法中接收动态数据
【发布时间】:2016-02-28 17:05:44
【问题描述】:

jqgrid 在 POST 请求缓冲区中将 json 数据发布为

{"headerData": {
    "Tasudok": "134",
    "Kuupaev": "2015-11-23",
    "Dokumnr": "135319"
   },


"rowData": {
  "Toode":"",
  "Kogus":"0.0000",
  "Nimetus":"öäölä<a",
  "_rowsum":"0.00",
  "Id":"1639",
  "Dokumnr":"135319",
  "_oper":"edit",
  "_rowid":"1639"
  }
}

使用带有默认路由的 API/Entity/someid?culture=en&layout=1 等 URL 将数据发布到 ASP.NET MVC4 Web API。

headerDatarowData 值属性在运行时定义并且可以变化。

例如,在某些调用中,rowData 可能包含其他属性,而某些 rowData 属性可能会丢失。

culturelayout 查询字符串参数是可选的。

如何在 WebAPI 控制器中接收参数?

我试过了

public class EntityController : APIController
{

public class PostParams {
    public string culture { get; set; }
    public int? layout { get; set; }
    }

    public HttpResponseMessage Post(string id, 
      [FromUri]PostParams optionalParams,
      [FromBody]IList<NameValue> headerData,
      [FromBody]IList<NameValue> rowData )
    { ... }


public class NameValue
{
    public string name, value;
}
}

但是 headerData 和 rowData 是空的。如何获取所有参数?

【问题讨论】:

    标签: asp.net json asp.net-mvc-4 asp.net-web-api free-jqgrid


    【解决方案1】:

    如果 JSON 的结构没有改变

    拥有这将允许您发送像您在 url 上提供的那样的正文 API/Entity/someid?culture=en&layout=1.

    要在控制器路由中指定可选查询参数,请给它们一个默认值,例如

    public class EntityController : APIController
    {
        public HttpResponseMessage Post([FromUri]string culture="EN", [FromUri]int layout=1, YourBody body )
        { ... }
    }
    

    如果 YourBody 总是像你提到的那样,应该自动反序列化这样的东西:

    public class YourBody
    {
        public Dictionary<string, string> HeaderData {get; set;}
        public Dictionary<string, string> RowData{get; set;}
    }
    

    并且可以让您完全访问正文的任何​​元素。

    如果 JSON 的结构可以改变

    这样的事情将允许接收任何类型的 json:

    public HttpResponseMessage  Post([FromBody]JToken body)
    {
        // Process the body
        return ...
    }
    

    您将需要一些额外的验证,因为不会进行对象反序列化。你唯一会知道的是你的身体是一个 JSON。

    因此,您可能需要对其进行解析以查看它是否符合您的预期。 见that post about how to access element of a JSON with JToken

    例如,您可以执行以下操作来处理不断变化的正文内容并仍然处理路由的可选查询参数:

    public HttpResponseMessagePost([FromBody]JToken body, [FromUri]string culture="EN", [FromUri]int layout=1)
    {
        JObject headerData= body["headerData"].Value<JObject>();
        JObject headerData= body["rowData"].Value<JObject>();
        return ...;
    }
    

    您还可以阅读this,了解将原始数据发布到 webapi 控制器的其他替代方法。

    【讨论】:

    • 第一个post方法签名导致编译错误Optional parameters must appear after all required parameters
    • 你的编译器是对的!我将更新我的帖子(我在文本编辑器中编写了该代码,无法访问 VS 或编译器)如果您按照编译器告诉您的操作,您会得到什么?它编译了吗?
    • 是的,然后编译。很好的答案和很好的链接,谢谢。
    • 如果它符合您的要求,我提前感谢您将我的答案标记为已接受。如果我的回答仍有问题,请告诉我,我会更新!
    • 我尝试了第一个签名。 headerDatarowData 在控制器中都有空值。如何为他们接收价值?
    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2016-11-20
    相关资源
    最近更新 更多