按名称获取路线

时间:2014-12-17 07:41:42

标签: c# asp.net-web-api asp.net-mvc-routing hypermedia

我正在使用超媒体开发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的路由的路由配置数据。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

如果你可以使用Route属性,你可以通过name属性命名你的路由,我做的是我在RoutesHelper中定义我的路由,当我定义我的控制器路由时,我引用这个常量,当我想使用CreatedAtRoute时例如,我引用相同的routeName并传递参数来构造路由。

所以让我们说我的控制器叫做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...
    }
}

现在在我的Post方法中,我使用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's name and construct the route parameters.
    var response = CreatedAtRoute(RoutesHelper.RouteNames.People, new { id = added.Id }, added);

    return response;
}

希望这有帮助。