ASP .NET WebAPI路由数据模式

时间:2015-11-04 16:05:40

标签: c# asp.net asp.net-web-api routes schema

目前,我们正在使用这样的路线:

[HttpPost]
[Route("upload")]
public async Task<dynamic> Upload(dynamic uploadedData)
{
    JArray files = uploadedData.pdfs;
    // ...
}

我不想使用dynamic,而是希望对进入的数据有一个原理图。所以我可以使用这样的设置,使用定义模式的类:

public class UploadRequest : JObject
{
    public JArray pdfs { get; set; }
}

[HttpPost]
[Route("upload")]
public async Task<dynamic> Upload(UploadRequest uploadedData)
{
    // Now can access the JArray via uploadedData.pdfs directly
    // ...
}

这是解决这种情况的正确方法吗?或者是否有另一种通过ASP .NET WebAPI接收JSON数据的标准最佳实践?

具体来说,这种方法目前不起作用。虽然我的小模式类扩展了JObject,但我得到了错误

  

参数字典包含参数'uploadedData'的无效条目,用于方法'System.Threading.Tasks.Task`1 [System.Object] Upload(UploadRequest)'in'EditPdfServer.Controllers.PdfFileController'。该字典包含“Newtonsoft.Json.Linq.JObject”类型的值,但该参数需要“EditPdfServer.Controllers.PdfFileController + UploadRequest”类型的值。

首先,这看起来像是一种正确的方法吗?其次,有更好的吗?第三,为什么这种方法不起作用?提前谢谢。

3 个答案:

答案 0 :(得分:6)

你正在走上正轨。

您不必过分关注Newtonsoft.Json的内部实现。特别是,你应该尽量避免使用JObject / JToken /其他J类型,你绝对不需要继承JObject。

您的请求对象类可以是:

public class UploadRequest
{
    [JSONProperty("pdfs")]
    public SomePDFClass PDFs[] { get; set; }
}

这将映射到以下请求:

{
    "pdfs": [
        { <some PDF object here> },
        { <some PDF object here> },
        { <some PDF object here> }
    ]
}

JSONPropertyAttribute的字符串参数定义了JSON文档中显示的属性名称,因此您不需要在代码中使用与JSON中相同的名称。您可以在代码中更改名称,只要该属性仍然使用与文档相同的名称。

答案 1 :(得分:5)

我建议您使用JSON属性属性为pdfs属性:

public class UploadRequest : JObject
{
   [JSONProperty("<name of the property in the JSON object>")]
   public JArray pdfs { get; set; }
}

另请查看此帖子,了解有关该属性的更多信息:JSON.NET deserialize/serialize JsonProperty JsonObject

答案 2 :(得分:0)

由于您的方法使用的是动词,您应该在方法参数上添加属性<div class="pan"> <img src="http://lorempixel.com/1920/480/" /> </div>

[FromBody]