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. 有什么办法吗?

4

1 回答 1

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;
}

希望这可以帮助。

于 2014-12-17T23:16:34.540 回答