.NET MVC2自定义子页面路由

时间:2010-09-01 04:28:59

标签: .net asp.net-mvc-2 routing split

在搜索过程中,我遇到了ASP.NET MVC page/subpage routing并且通配符有点救命,但提出了一个新问题。

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

那是什么方法呢?

// 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。编辑#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工作..以及之后的任何东西都会解析掉最后一个slu ..所以[domain] slug / sub / sub / sub / content会抓住与内容slug匹配的页面。

1 个答案:

答案 0 :(得分:1)

将通配符作为您的网址路由中的第一个参数,会将每个请求路由到Content路由。为了达到你想要的效果,你可以使用这条路线。

route.MapRoute(
    "Content",
    "Page/{*strSlug}",
    new { controller = "Home", action = "SiteContent", strSlug = UrlParameter.Optional }
);

访问 www.domain.com 将使用默认路由,并且 www.domain.com/Page 将使用Content路由,以便 www.domain.com/Page/subpage 的。

www.domain.com/Page/subpage1/subpage2

以上网址会为strSlug ActionResult的SiteContent参数提供值subpage1/subpage2。然后,您可以解析strSlug以获取您的内容。