【问题标题】:Custom routes and namespaces in MVC5MVC5 中的自定义路由和命名空间
【发布时间】:2016-08-04 19:48:37
【问题描述】:

我正在尝试在我现有的 MVC5 应用程序中实现一些域名逻辑。我遇到的问题是,如果我尝试使用 Route 中的自定义子类,它不尊重命名空间字段并引发错误,因为我有 2 个不同的用户控制器。

作为一个控件,它工作得非常好:

routes.MapRoute("Login", 
                "login/", 
                new { controller = "User", action = "Login" }, 
                new[] { "Quotes.Web.Controllers" });

我的 DomainRoute 类继承自 Route 并且只是添加了一个 Domain 属性。这是相关的构造函数:

public DomainRoute(string domain, string url, object defaults, string[] namespaces = null)
        : base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
    {
        Domain = domain;
        DataTokens = new RouteValueDictionary {["Namespaces"] = namespaces};
    }

我像这样注册它:

var loginRoute = new DomainRoute(
   domain,
   "login/",
   new { controller = "User", action = "Login" },
   new[] { "Quotes.Web.Controllers" });
routes.Add("Login", loginRoute);

DataTokens 在工作版本和我的损坏版本之间看起来相同,但它似乎忽略了我的 DomainRoute 有一个命名空间条目的事实

找到了多个与名为“用户”的控制器匹配的类型。如果为该请求提供服务的路由(“login/”)未指定命名空间来搜索与请求匹配的控制器,则可能会发生这种情况。如果是这种情况,请通过调用带有“namespaces”参数的“MapRoute”方法的重载来注册此路由。

我错过了什么?

【问题讨论】:

    标签: asp.net-mvc-5 routing


    【解决方案1】:

    我认为,this 会帮助你,我有同样的问题,通过添加以下代码解决了这个问题

       var dataTokens = new RouteValueDictionary();
            var ns = new string[] {"MyProject.Controllers"};
            dataTokens["Namespaces"] = ns;
    
    
            routes.Add("Default", new CultureRoute(
                                      "{controller}/{action}/{id}",
                                      new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                                      null /*constraints*/,
                                      dataTokens
                                      ));
    

    【讨论】:

      【解决方案2】:

      我将我的 DomainRoute 类切换为在此处找到的经过改进的版本:https://gist.github.com/IDisposable/77f11c6f7693f9d181bb

      现在我的路线创建只是:

      var clientRoutes = new DomainRouteCollection("mydomain", 
                                                   "Quotes.Web.Controllers",
                                                   routes);
      clientRoutes.MapRoute("Login", "login/", new { controller = "User", action = "Login" });
      

      ...更简洁,更重要的是,它有效。

      【讨论】:

        猜你喜欢
        • 2017-07-31
        • 2018-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 2015-07-05
        相关资源
        最近更新 更多