使用 FromUri 将复杂对象传递到 ASP.NET Web API
Passing Complex Objects to ASP.NET Web API Using FromUri
我想使用属性路由和 [FromUri]
属性将 URL 参数绑定到我的 Point
对象,以便可以实现以下 URL:
/foo-1,2
public IHttpActionResult PostFoo(
[FromBody] string content,
[FromUri] Point point)
{
}
public class Point
{
public int A { get; set; }
public int B { get; set; }
// ...Other properties omitted for simplicity
}
我已经尝试了以下路由属性,但 none 这些都有效:
[Route("foo-{a},{b}")]
[Route("foo-{A},{B}")]
[Route("foo-{point.A},{point.B}")]
请注意,我不能使用查询字符串参数,因为构建不当的第三方服务不接受 URL 中的 & 符号(是的,就是这么糟糕)。所以我试图将所有查询字符串参数构建到 URL 本身。
我知道的两个选项是:
使用URL Rewriter全局处理每条路线。优点是(我希望)您的发布者确实有某种类型的标准 url 您可以转换为友好的 MVC 路线。
如果没有,那么您可能必须编写自己的 RouteHandler。不确定你是否可以在全球范围内使用它,但你必须注册很多次(真的不那么难)。
public class CustomRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var acceptValue = requestContext.HttpContext.Request.Headers["Accept"];
if( /* do something with the accept value */)
{
// Set the new route value in the
// requestContext.RouteData.Values dictionary
// e.g. requestContext.RouteData.Values["action"] = "Customer";
}
return base.GetHttpHandler(requestContext);
}
}
然后注册它:
RouteTable.Routes.MapRoute(
name: "Custom",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
).RouteHandler = new CustomRouteHandler();
我想使用属性路由和 [FromUri]
属性将 URL 参数绑定到我的 Point
对象,以便可以实现以下 URL:
/foo-1,2
public IHttpActionResult PostFoo(
[FromBody] string content,
[FromUri] Point point)
{
}
public class Point
{
public int A { get; set; }
public int B { get; set; }
// ...Other properties omitted for simplicity
}
我已经尝试了以下路由属性,但 none 这些都有效:
[Route("foo-{a},{b}")]
[Route("foo-{A},{B}")]
[Route("foo-{point.A},{point.B}")]
请注意,我不能使用查询字符串参数,因为构建不当的第三方服务不接受 URL 中的 & 符号(是的,就是这么糟糕)。所以我试图将所有查询字符串参数构建到 URL 本身。
我知道的两个选项是:
使用URL Rewriter全局处理每条路线。优点是(我希望)您的发布者确实有某种类型的标准 url 您可以转换为友好的 MVC 路线。
如果没有,那么您可能必须编写自己的 RouteHandler。不确定你是否可以在全球范围内使用它,但你必须注册很多次(真的不那么难)。
public class CustomRouteHandler : MvcRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var acceptValue = requestContext.HttpContext.Request.Headers["Accept"];
if( /* do something with the accept value */)
{
// Set the new route value in the
// requestContext.RouteData.Values dictionary
// e.g. requestContext.RouteData.Values["action"] = "Customer";
}
return base.GetHttpHandler(requestContext);
}
}
然后注册它:
RouteTable.Routes.MapRoute(
name: "Custom",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
).RouteHandler = new CustomRouteHandler();