【问题标题】:Route constraint to check if Url contains any controller name路由约束以检查 Url 是否包含任何控制器名称
【发布时间】:2015-08-06 01:36:24
【问题描述】:

我想创建一个不属于任何控制器的路由。表示如果 url 不包含任何控制器名称,它应该重定向到特定操作

我怎样才能为这样的路线创建约束。

例如,如果我有诸如

之类的路线
routes.MapRoute(
            name: "user",
            url: "{username}/{id}",
            defaults: new { controller = "Home",     action="username",id=UrlParameter.Optional },
            constraints: new { isuser = new checkuserConstraint() }
        );

应该限制什么,这样它就不会重定向到默认的home/index 路由

编辑:如果使用 www.domain.com/admin/adminid 作为 url,它将返回错误,因为没有名为 admin 的控制器。在这种情况下,我希望它调用 home 控制器的 username 操作。

【问题讨论】:

  • 您能提供更多信息吗?请准确地说出你想要什么?提供一些 URL 和匹配的操作。
  • @SamFarajpourGhamari 查看我的编辑

标签: c# model-view-controller


【解决方案1】:

例如,如果您想将/admin/1 之类的url 映射到AccountController.DoSomething(int id, string username),首先您需要在默认规则之前添加以下带有自定义约束的路由规则以过滤掉不匹配的用户名。

routes.MapRoute(
    name: "myRoute",
    url: "{username}/{id}",
    defaults: new { controller = "Account", action = "DoSomething" },
    constraints: new { username = new MyCatConstraint() }
);
 // your other route rules are here

您的自定义约束可能是这样的:

public class MyCatConstraint : IRouteConstraint
{
    // suppose this is your username list. In the real world a DB provider 
    private string[] _myUsernames = new[] { "user1", "user2", "user3" };

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        // return true if you found a match on your user's list otherwise false
        // in the real world you could query from DB to match cats instead of searching from the array.  
        if(values.ContainsKey(parameterName))
        {
            return _myUsernames.Any(c => c == values[parameterName].ToString());
        }
        return false;
    }
}

此路由与以下操作匹配:

public AccountController
{
    public ActionResult DoSomething(int id, string username)
    {
    }
}

【讨论】:

  • admin 是用户名。对于不同的用户,它会有所不同
  • 那么adminid 是什么?您的 url 可能是 /admin/1/user1/2/user2/2 并且您希望将所有这些都映射到一个操作?
  • 我们终于互相了解了。 ;) 我已更新帖子以回答您的问题。
  • 谢谢..这就是我想要的:)
猜你喜欢
  • 2012-05-11
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
相关资源
最近更新 更多