【问题标题】:MVC custom routing functionMVC自定义路由功能
【发布时间】:2012-07-20 11:58:51
【问题描述】:

这是我的另一个问题的更具体版本:Restful MVC Web Api Inheritance,我希望对此的回答能帮助我回答。

我正在使用 ASP.NET web api,
我希望能够像这样路由:[{object}/{id}]/{controller}/{id}.
所以我想要一个带有可选/{id}的对象数组,以'api端点'结尾。

我希望能够路由这些:
/houses
/houses/3
suburbs/3/houses
council/5/suburbs/houses
city/8/council/suburbs/houses

get(List<restRoute>parents, int id){
    ...
}

restRoute 将是一个对象,其中对象的字符串和 id 的可选 int(或 guid 等)

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

【问题讨论】:

  • 我看不到您显示的最后 2 个网址与路线的对应关系。根据控制器名称后的路由定义,您只能有一个 id。此外,还不清楚您为什么使用 List&lt;object&gt; 作为您的操作参数。你如何期望模型绑定器知道如何处理这个对象?
  • 也许您可以在RegisterRoutes 中动态生成路由在global.asax 中?否则,我不知道...
  • @DarinDimitrov 我说/{id} 是可选的。我通过稍微编辑问题来解决列表对象。
  • @TheJonasPersson 你会怎么做?
  • 哪个id 是可选的?只有路由的 last 标记可以是可选的。

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


【解决方案1】:

您可以在路由中使用 {*anything} Variable Segmented URL 模式并处理拆分并确定 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&lt;RestRoute&gt; 格式,然后再将请求传递给控制器​​

【讨论】:

  • 我最终使用了这种方法,它工作得很好,因为它允许我使用带有单个控制器的工厂架构。
【解决方案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。
  • 这个基于属性的路由库是开源的,具有 MIT 许可证。积极的是,您可以将此实现视为示例,然后为您的解决方案实现类似的通用路由。源代码托管在 Git github.com/mccalltd/AttributeRouting
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2013-09-30
  • 2011-04-02
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多