在搜索过程中,我遇到了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匹配的页面。
答案 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
以获取您的内容。