通过 FromUri 将复杂对象传递给 ASP.NET Web API

3
我希望使用属性路由和 [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
}

我尝试了以下路由属性,但这些都不起作用:

[Route("foo-{a},{b}")]
[Route("foo-{A},{B}")]
[Route("foo-{point.A},{point.B}")]

请注意,由于一个糟糕的第三方服务在其URL中不接受&符号,因此我无法使用查询字符串参数(是的,情况确实如此糟糕)。因此,我尝试将所有查询字符串参数构建到URL本身中。

在MVC处理URL之前,您可能需要考虑使用URL-Rewriter来重写URL。这将使任何URL的处理变得非常容易。 - Erik Philips
@ErikPhilips 我在考虑编写某种过滤器或模型绑定器来完成同样的事情。我想退回到IIS也是一个有效的选择。 - Muhammad Rehan Saeed
1
模型绑定器在选择路由时太晚了。你可能需要编写一个RouteHandler - Erik Philips
1个回答

1
我知道的两种选择是:
使用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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接