Получить маршрут по имени

1

Я работаю над asp.net web api с гипермедией. Теперь я создаю создателя ссылок, который создает ссылку на ресурс, открытый контроллером. Он должен поддерживать маршруты атрибутов, которые я решил с отражением, но также сопоставил маршруты, указанные в Owin.AppBuilder:

public void Configuration(IAppBuilder appBuilder)
{
    var config = new HttpConfiguration();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "{controller}/{id}",
        defaults: new { controller = "Home", id = RouteParameter.Optional }
        );
    // ...
}

Я мог бы использовать для этого класс UrlHelper, но он зависит от текущего запроса, а ссылка, которую я создаю, может быть на другом контроллере и, следовательно, не имеет отношения к текущему запросу. Поэтому мне нужно загрузить данные конфигурации маршрута для маршрута с именем DefaultApi. Это любой способ сделать это?

Теги:
asp.net-web-api
asp.net-mvc-routing
hypermedia

1 ответ

1

Если вы можете использовать атрибут Route Attribute, вы можете назвать свой маршрут через свойство name, то, что я сделал, я определил свои маршруты в RoutesHelper, и когда я определяю маршрут контроллера, я ссылаюсь на эту константу и когда я хочу использовать CreateAtRoute, например, я ссылайтесь на одно и то же имя маршрута и передавайте параметры для построения маршрута.

Поэтому позвольте сказать, что мой контроллер называется PeopleController, тогда я бы определил свой контроллер как:

[Route("api/people/{id:int:min(1)?}", Name = RoutesHelper.RouteNames.People)]
public class PeopleController : ApiController
{
   // controller code here
}

где RoutesHelper выглядит следующим образом:

public static class RoutesHelper
{
    public struct RouteNames
    {
        public const string People = "People";
        // etc...
    }
}

Теперь в моем методе "Почта" я использую CreateAtRoute следующим образом:

[HttpPost]
[ResponseType(typeof(PersonDto))]
public async Task<IHttpActionResult> AddAsync([FromBody] personDto dto)
{
    // some code to map my dto to the entity using automapper, and save the new entity goes here
    //.
    //.

    // here, I am mapping the saved entity to dto 
    var added = Mapper.Map<PersonDto>(person);

    // this is where I reference the route by it name and construct the route parameters.
    var response = CreatedAtRoute(RoutesHelper.RouteNames.People, new { id = added.Id }, added);

    return response;
}

Надеюсь это поможет.

  • 0
    Спасибо, но я боюсь, что это не совсем решает проблему, так как я делаю компонент для создания ссылок, который должен поддерживать как атрибутные маршруты, так и маршруты, настроенные в контейнере owin, тогда как проблема заключается в чтении шаблонов маршрутов. из контейнера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню