MVC5

时间:2016-08-04 19:48:37

标签: asp.net-mvc-5 routing

我正在尝试在我现有的MVC5应用程序中实现一些域名逻辑。我遇到的问题是,如果我尝试使用Route中的自定义子类,它不会尊重Namespaces字段并抛出错误,因为我有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有一个命名空间条目的事实

  

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

我错过了什么?

2 个答案:

答案 0 :(得分: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
                                  ));

答案 1 :(得分:0)

我用我在这里找到的改进版本切换了我的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" });

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