.NET MVC2自定义子页面路由
在搜索过程中,我发现通配符在某种程度上是一个救命符,但它提出了一个新问题 如果愿意的话,可以考虑以下路线。这里的目标是让索引()使用默认路由,[domain]/page使用内容路由。strSlug是一个通配符,因为我计划拆分slug以用于子页面。[域]页面/子页面(子页面将是当前slug)。由于它是一个通配符,[domain]似乎在内容路径上匹配 正确的解决方法是什么.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
// 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