При поиске я наткнулся на ASP.NET MVC маршрутизация страниц / подстраниц , и подстановочный знак был чем-то вроде спасения жизни, но представил новую проблему.
Рассмотрите следующие маршруты, если хотите. Здесь цель состоит в том, чтобы индекс (http://www.domain.com) использовал маршрут по умолчанию и [домен] / page использовал маршрут Content . StrSlug - это подстановочный знак потому что я планирую разделить слаг для использования на подстраницах. [домен] страница / подстраница (подстраница будет текущим слагом). Поскольку это подстановочный знак, кажется, что [домен] совпадает с Содержание Маршрут.
Что будет правильным для этого?
// 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);
}
EDIT:
Проводя дальнейшие исследования, я надеялся использовать что-то вроде этого.
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);
}
Итак, [домен] / слаг работает .. и все, что после этого анализирует последний слаг .. так что [домен] слаг / sub / sub / sub / content будет захватывать страницу, соответствующую слагу содержимого.