.NET MVC2自定义子页面路由

.NET MVC2自定义子页面路由,.net,asp.net-mvc-2,routing,split,.net,Asp.net Mvc 2,Routing,Split,在搜索过程中,我发现通配符在某种程度上是一个救命符,但它提出了一个新问题 如果愿意的话,可以考虑以下路线。这里的目标是让索引()使用默认路由,[domain]/page使用内容路由。strSlug是一个通配符,因为我计划拆分slug以用于子页面。[域]页面/子页面(子页面将是当前slug)。由于它是一个通配符,[domain]似乎在内容路径上匹配 正确的解决方法是什么 // Global.asx.cs routes.MapRoute( "Content", // Route

在搜索过程中,我发现通配符在某种程度上是一个救命符,但它提出了一个新问题

如果愿意的话,可以考虑以下路线。这里的目标是让索引()使用默认路由,[domain]/page使用内容路由。strSlug是一个通配符,因为我计划拆分slug以用于子页面。[域]页面/子页面(子页面将是当前slug)。由于它是一个通配符,[domain]似乎在内容路径上匹配

正确的解决方法是什么

// Global.asx.cs  
routes.MapRoute(
        "Content", // Route name
        "{*strSlug}", // URL with parameters
        new { controller = "Home", action = "SiteContent", strSlug = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
    );

    // HomeController.cs
    // Not the best code, feel free to improve.
    public ActionResult SiteContent(string strSlug)
    {
        string[] strSlug_arr = strSlug.Split("/".ToCharArray());
        strSlug = strSlug_arr[(strSlug_arr.Length-1)];

        SiteContent data = DB.SiteContents.Single(c => c.Slug == strSlug);
        return View(data);
    }
编辑: 在做更多的研究时,我希望使用这样的东西

public ActionResult Index()
{
    SiteContent data = DB.SiteContents.Single(c => c.Slug == "home-page");
    return View(data);
}

public ActionResult SiteContent(string strSlug)
{
    if (strSlug == null)
    {
        return RedirectToAction("Index");
    }
    else
    {
        string[] strSlug_arr = strSlug.Split("/".ToCharArray());
        strSlug = strSlug_arr[(strSlug_arr.Length - 1)];

        SiteContent data = DB.SiteContents.Single(c => c.Slug == strSlug);
        return View(data);
    }
}
…但由于某种原因,这会导致重定向循环

编辑#2 所以这个解决方案,有点,可能有效?我还没有看到不利的一面

    // Global.asx.cs
    routes.MapRoute(
        "Content", // Route name
        "{strSlug}/{*strSubSlug}", // URL with parameters
        new { controller = "Home", action = "SiteContent", strSubSlug = UrlParameter.Optional } // Parameter defaults
    );

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
    );


    // HomeController.cs
    public ActionResult Index()
    {
        SiteContent data = DB.SiteContents.Single(c => c.Slug == "home-page");
        return View(data);
    }

    public ActionResult SiteContent(string strSlug, string strSubSlug)
    {
        /*
        string[] strSlug_arr = strSlug.Split("/".ToCharArray());
        strSlug = strSlug_arr[(strSlug_arr.Length - 1)];
         */

        if (strSubSlug != null)
        {
            string[] strSubSlug_arr = strSubSlug.Split("/".ToCharArray());
            strSlug = strSubSlug_arr[(strSubSlug_arr.Length - 1)];
        }

        SiteContent data = DB.SiteContents.Single(c => c.Slug == strSlug);
        return View(data);
    }

所以[domain]/slug可以工作。。之后的任何东西都会从最后一个鼻涕虫中分离出来。。因此[domain]slug/sub/sub/sub/content会抓取与内容slug匹配的页面。

将通配符作为url路由中的第一个参数,会将每个请求路由到
content
路由。要实现您想要的,您可以使用此路线

route.MapRoute(
    "Content",
    "Page/{*strSlug}",
    new { controller = "Home", action = "SiteContent", strSlug = UrlParameter.Optional }
);
通过访问www.domain.com将使用默认路由,而www.domain.com/Page将使用
内容
路由,如www.domain.com/Page/subpage


上面的url将为
SiteContent
ActionResult的
strSlug
参数提供值
subpage1/subpage2
。然后你可以解析你的
strSlug
来获取你的内容。

我注意到我可以通过这个解决方案,但是我有严格的指示,除了域和slug之外,我没有别的东西。除此之外,索引页与内容/分包是不同的母版页。是的,但不可能通过路由访问索引页,因为路由是要执行操作的MVC的指南。如果对路线中的所有内容进行通配符,则所有内容都将被通配符捕获。您的路由中必须至少有一个对控制器的调用或一个静态字符串,以便不是所有路由都被通配符捕获。让我重新表述一下,您的Url中必须至少有一个控制器和操作段或一个静态字符串段,在通配符之前有MapRoute的参数,以便不是所有对页面(包括索引)的调用不会被通配符捕获。无限循环是由于通配符导致的,它始终指向SiteContent,即使您只是调用
www.domain.com
www.domain.com/Page/subpage1/subpage2