MVC自定义路由功能

时间:2012-07-21 12:57:09

标签: asp.net-mvc web-services rest asp.net-mvc-4 asp.net-web-api

这是我另一个问题的更具体版本: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等)

有谁知道我可以从哪里开始?
我不想单独路由每一个。

2 个答案:

答案 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