我受到我方和客户之间协议的约束,使用包含破折号的json参数.由于无法在C#中的属性名称中使用它,我需要映射到所需的属性.
我现在应该做什么:
The below code is simplified for convenience.
模型
public class MyRequest
{
[JsonProperty("request-number")]
public string RequestNumber { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
调节器
[HttpGet]
[Route("api/load-stuff")]
public Stuff LoadStuff([FromUri]MyRequest request)
{
return BackEnd.LoadStuff(request);
}
从客户端调用API
使用此uri定位上述控制器:
http://localhost:12345/api/load-stuff?request-number=X123&name=requestName
我的问题
如果我在BackEnd.LoadStuff行放置断点,我可以看到呼叫到达,但请求未正确映射.
Name contains what I expect:
requestName
, but RequestNumber isnull
, so the mapping didn’t work.
出了什么问题?
最佳答案 在尝试将请求参数绑定到模型时,ASP.NET的默认模型绑定程序不会将JsonPropertyAttribute考虑在内(它不能,因为它不知道JsonPropertyAttribute和NewtonSoft.Json的其余部分).鉴于您的场景(属性名称在C#中不是合法标识符),实现所需内容的唯一方法是通过读取JsonPropertyAttribute的
custom model binder.
如果您确实具有合法标识符的属性名称(例如request_number),那么您可以使用这些命名属性创建请求模型,然后将其映射到具有正确命名属性的单独模型,例如:
public class MyController : ApiController
{
[HttpGet]
[Route("api/load-stuff")]
public Stuff LoadStuff([FromUri]MyRequest request)
{
return BackEnd.LoadStuff(request.ToMyPrettyRequest());
}
}
public class MyRequest
{
public string request_number { get; set; }
public string name { get; set; }
MyPrettyRequest ToMyPrettyRequest()
{
return new MyPrettyRequest
{
RequestNumber = request_number,
Name = name,
};
}
}
public class MyPrettyRequest
{
public string RequestNumber { get; set; }
public string Name { get; set; }
}