Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何分离具有相同路径但执行不同操作的路线?_C#_Asp.net Mvc - Fatal编程技术网

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;
}