【问题标题】:Exclude a Controller from Default Route C# MVC从默认路由 C# MVC 中排除控制器
【发布时间】:2014-10-09 18:15:38
【问题描述】:

我想阻止路由处理我的一个控制器,称为MyController

我认为这可能有效,但它没有:

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{urlId}",
    defaults: new { controller = "Home", action = "Index", urlId = UrlParameter.Optional },
    constraints: new { controller = @"^(!?MyController)$" }
);

遗憾的是,它阻止我导航到我的任何控制器。

如果控制器使用(!?MyController.*) 包含MyController,我只能让它不匹配,但这并不完全匹配。

我尝试过的所有正则表达式测试人员都建议它应该只匹配 完全 MyController

【问题讨论】:

  • 嗨。它是第一条映射路线。

标签: c# regex asp.net-mvc asp.net-mvc-routing


【解决方案1】:

在这里找到这个http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints

创建 NotEqual 类以在您的约束中使用

public class NotEqual : IRouteConstraint
{
  private string _match = String.Empty;

  public NotEqual(string match)
  {
    _match = match;
  }

  public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
  {
    return String.Compare(values[parameterName].ToString(), _match, true) != 0;
  }
}

然后在你的 RouteConfig 中使用该类

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{urlId}",
    defaults: new { controller = "Home", action = "Index", urlId = UrlParameter.Optional },
    constraints: new { controller = new NotEqual("MyController") }
);

【讨论】:

  • @Coulton 就像你知道的那样,因为 MVC 是约定驱动的,在大多数必须指定控制器的地方,你不必输入单词控制器,MVC 知道寻找一个控制器前面带有您指定的内容。
  • 感谢您的信息,我对省略控制器位有点困惑,在这个示例中如何工作?
  • @Luke 你可以使用new NotEqual("My")
  • 如果你的控制器被命名为“MyController”,大多数时候,你只需传递“My”作为参数,MVC在查找控制器时会自动添加“Controller”。这就是 JB06 所解释的。
  • 嗯,好吧。我不确定此示例是否属于这种情况,它针对控制器值执行 string.Compare() 。这是否意味着框架对字符串MyMyController 以及其他约定运行NotEqual 的Match() 方法?不是 MVC 代码进行匹配,而是我们在 IRouteConstraint 实现中的自定义代码
猜你喜欢
  • 2010-12-15
  • 2016-10-07
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多