MVC:如何在第一个路由参数中管理URL中的slahses

Dan*_*lba 6 .net c# asp.net-mvc asp.net-mvc-routing

我需要在我的ASP MVC应用程序中将两个可能包含斜杠的变量映射到控制器.让我们看一个例子.

在此输入图像描述

  • 存储库和路径将是URL编码的参数.
  • 存储库可以有0个斜杠或1个斜杠作为最大值(rep或rep/module)
  • 路径可以有任意数量的斜杠.

例如,这些是有效的URL:

http://mysite/rep/Items
http://mysite/rep/module/Items/foo/bar/file.c
Run Code Online (Sandbox Code Playgroud)

有人可以就如何定义这条路线提出一些建议吗?

Dan*_*lba 2

最后,根据Darin Dimitrov的回答,我实现了以下自定义路线,解决了我的问题:

public class RepositoryRoute : Route
{
    public RepositoryRoute(string name, string url, object defaults)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    {
        string moduleUrl = url.Replace(
            REPOSITORY_PARAMETER, REPOSITORY_PARAMETER + MODULE_PARAMETER);
        mModuleRoute = new Route(
            moduleUrl, new RouteValueDictionary(defaults), new MvcRouteHandler());
    }

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        RouteData rd = mModuleRoute.GetRouteData(httpContext);

        if (rd == null)
            return base.GetRouteData(httpContext);

        if (!rd.Values.ContainsKey(MODULE))
            return rd;

        // set repository as repo/submodule format
        // if a submodule is present in the URL
        string repository = string.Format("{0}/{1}",
            rd.Values[REPOSITORY],
            rd.Values[MODULE]);

        rd.Values.Remove(MODULE);
        rd.Values[REPOSITORY] = repository;

        return rd;
    }

    Route mModuleRoute;

    const string REPOSITORY = "repository";
    const string MODULE = "module";

    const string REPOSITORY_PARAMETER = "{" + REPOSITORY + "}/"; // {repository}/
    const string MODULE_PARAMETER = "{" + MODULE + "}/"; // {module}/
}
Run Code Online (Sandbox Code Playgroud)

其注册方式如下:

       routes.Add(new RepositoryRoute(
                        "Items",
                        "{repository}/Items/{*path}",
                        new { controller = "Items", action = "Index", path = "/" }
        ));
Run Code Online (Sandbox Code Playgroud)

该路由使用内部路由,它定义了一个模块参数,如果找到它,我会将其连接到存储库,然后将其删除。因此映射存储库或存储库/模块是透明的。