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