这是我另一个问题的更具体版本:Restful MVC Web Api Inheritance,我希望这个问题的答案可以帮助我回答这个问题。
我正在使用ASP.NET web api,
我希望能够路由这样的事情:[{object}/{id}]/{controller}/{id}
。
所以我想要一个带有可选/{id}
的对象数组,以'api endpoint'结尾。
我希望能够路由这些:
/houses
/houses/3
suburbs/3/houses
council/5/suburbs/houses
city/8/council/suburbs/houses
ETC
TO
get(List<restRoute>parents, int id){
...
}
restRoute将是一个带有对象字符串的对象,另一个是id的可选int(或guid等)
有谁知道我可以从哪里开始?
我不想单独路由每一个。
答案 0 :(得分:2)
我在ASP.NET MVC的框中也有路由问题。它是用作公共路由的好方法,但对于自定义路由不是那么灵活。
在WCF Web Api(CTP版本中的ASP.NET web api)中使用了基于属性的路由。
我认为它更灵活,但作为消极点 - 每个方法都应该有路由属性。
看一下这篇博文:
http://www.strathweb.com/2012/05/attribute-based-routing-in-asp-net-web-api/
它描述了如何使用ASP.NET Web Api实现基于属性的路由。因为这种方法对于可以映射到方法的路径更灵活,所以它对您有所帮助。
答案 1 :(得分:1)
您可以在路线中使用{*anything}
Variable Segmented URL模式并处理拆分并找出网址的哪个部分与您方法中的数据位相对应:
Global.asax:
routes.MapRoute(
"Special", // name
"{*allthethings}", // parameters
new { controller = "Special", action = "Sauce" } // defaults
);
SpecialController:
public ActionResult Sauce()
{
string data = RouteData.Values["allthethings"].ToString();
string[] items = data.Split('/');
foreach (string item in items)
{
// do whatever you need to figure out which is what!
}
return View();
}
如果你想对它有点聪明,你可以创建自己的自定义RouteHandler来进行分割。类似David Ebb's PK routehandler之类的东西可能会做到这一点,通过一些自定义来满足您在处理路线时的要求。您可以使用它来拆分“allthethings”参数并将其转换为List<RestRoute>
格式,然后再将请求传递给Controller