C# 如何分离具有相同路径但执行不同操作的路线?
以下路径C# 如何分离具有相同路径但执行不同操作的路线?,c#,asp.net-mvc,C#,Asp.net Mvc,以下路径Page/View/Id将转到页面控制器中的View方法。我还想要以下路线: /{page-title} 使用相同的方法。这样我就可以有如下URL: http://www.mysite.com/This-Is-a-Page 考虑到this-Is-a-Page可能也是一个控制器,我如何配置它 您可能可以添加一个catch-all,如下所示(将其放在默认路由之后): 动作签名如下所示: public ActionResult(string query) 如果您的“控制器”路由和“页面”
Page/View/Id
将转到页面控制器中的View
方法。我还想要以下路线:
/{page-title}
使用相同的方法。这样我就可以有如下URL:
http://www.mysite.com/This-Is-a-Page
考虑到
this-Is-a-Page
可能也是一个控制器,我如何配置它 您可能可以添加一个catch-all,如下所示(将其放在默认路由之后):
动作签名如下所示:
public ActionResult(string query)
如果您的“控制器”路由和“页面”路由(见下文)使用相同的/something
,则您必须实施以下规则:
在路线的顶端:
route. MapRoute(
"ControllerRoute"
"{controller}",
new { controller = "Home", action = "Index" }
new { controller = GetControllerNameRegex() }
);
route.MapRoute(
"PageRoute",
"{pageSlug}"
new { controller = "Page", action = "ShowPage" }
);
- 任何页面的名称都不能与正在使用的任何控制器匹配
- 或者,任何控制器的名称都不能与正在使用的任何页面匹配
private static string GetControllerNameRegex()
{
var controllerNamesRegex = new StringBuilder();
List<string> controllers = GetControllerNames();
controllers.ForEach(s =>
controllerNamesRegex.AppendFormat("{0}|", s));
return controllerNamesRegex.ToString().TrimEnd('|');
}
private static List<Type> GetSubClasses<T>()
{
return Assembly.GetCallingAssembly().GetTypes().Where(type =>
type.IsSubclassOf(typeof(T))).ToList();
}
public List<string> GetControllerNames()
{
List<string> controllerNames = new List<string>();
GetSubClasses<Controller>().ForEach(type => controllerNames.Add(type.Name));
return controllerNames;
}
私有静态字符串GetControllerNameRegex()
{
var controllerNamesRegex=新的StringBuilder();
列表控制器=GetControllerNames();
控制器。ForEach(s=>
AppendFormat(“{0}|”,s));
返回controllerNameRegex.ToString().TrimEnd(“|”);
}
私有静态列表getSubclass()
{
返回Assembly.GetCallingAssembly().GetTypes().Where(type=>
type.IsSubclassOf(typeof(T)).ToList();
}
公共列表GetControllerNames()
{
列表控制器名称=新列表();
getSubclass().ForEach(type=>controllerNames.Add(type.Name));
返回控制器名称;
}
NB:最好的做法是确保没有任何页面以控制器命名,您可以使用上面的代码在运行时强制执行
这已经发布了两次,与以下内容相同:仅当您在默认设置之前定义它时,此选项才有效;如果在默认设置之后定义,则它将假定标题为controllerNot,如果该标题没有控制器。此路径捕获所有与上述任何一项不匹配的内容。
private static string GetControllerNameRegex()
{
var controllerNamesRegex = new StringBuilder();
List<string> controllers = GetControllerNames();
controllers.ForEach(s =>
controllerNamesRegex.AppendFormat("{0}|", s));
return controllerNamesRegex.ToString().TrimEnd('|');
}
private static List<Type> GetSubClasses<T>()
{
return Assembly.GetCallingAssembly().GetTypes().Where(type =>
type.IsSubclassOf(typeof(T))).ToList();
}
public List<string> GetControllerNames()
{
List<string> controllerNames = new List<string>();
GetSubClasses<Controller>().ForEach(type => controllerNames.Add(type.Name));
return controllerNames;
}