2016-03-08 7 views
2

Я хочу, чтобы связать параметры URL в мой Point объекта с использованием маршрутизации атрибутов и [FromUri] атрибутов таким образом, что следующий URL можно:Передача сложных объектов в ASP.NET Web API Использование FromUri

/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-адресе.

+0

Вы можете рассмотреть вопрос об использовании URL-Rewriter переписать URL прежде, чем это делает его MVC. Сделал бы вещь смехотворно легкой для любого url. –

+0

@ErikPhilips Я подумывал написать какой-то фильтр или связующее для модели, чтобы сделать то же самое. Я думаю, что возвращение к IIS является допустимым вариантом. –

+1

Взаимодействие с моделью очень долго в процессе выбора маршрута. Вам, вероятно, потребуется написать [RouteHandler] (http://www.brainthud.com/cards/5218/24821/give-an-example-of-how-you-would-create-a-custom-route- обработчик к Reroute-запросов-с-определенной стоимости-в-принять-HTTP-он). –

ответ

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();