【问题标题】:How to add namespace to custom route extension如何将命名空间添加到自定义路由扩展
【发布时间】:2010-11-05 05:57:43
【问题描述】:

我使用 routes.add 而不是 routes.maproute(它有一个命名空间 arg) 因为我扩展了路线类。 我需要在路由上添加命名空间,因为我的一个区域具有相同的控制器名称 网站内。 我的问题是我不知道将命名空间放在哪里..

public class CultureRoute : Route { public CultureRoute(string url, object defaults, object constraints, RouteValueDictionary dataTokens) : base(url, new RouteValueDictionary(constraints), dataTokens, new MvcRouteHandler()) { } }

全球.asax

routes.Add("Default", new CultureRoute( "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional}));

【问题讨论】:

    标签: asp.net-mvc model-view-controller


    【解决方案1】:
    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】:

      编辑:(之前创建了自定义路线,但这不是必需的)。这应该可以解决问题。至少在 MVC 4 和最有可能在 MVC 3 中是这样

      Route defRoute = new CultureRoute ("{controller}/{action}/{id}",
                  new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
                  new SomeRouteHandler());
      if( defRoute.DataTokens == null )
            defRoute.DataTokens = new RouteValueDictionary();
      defRoute.DataTokens.Add("Namespaces", new string[] { "MVCApp.WebUI.Controllers" });
              routes.Add(defRoute);
      

      【讨论】:

        【解决方案3】:

        对于那些正在为此寻找解决方案的人:

        您首先需要一个接受 DataTokens 参数的构造函数,并将其传递给 Route 构造函数。

        例如,我使用的是我在网上学习的 DomainRoute 类,它没有传递到 Domain 所需的额外参数。所以我简单实现了一个类似于基础Routeconstructor的构造函数:

        public DomainRoute(string domain, string url, object defaults, object constraints, object dataTokens)
                      : base(url, new RouteValueDictionary(defaults), new RouteValueDictionary(constraints),new RouteValueDictionary(dataTokens),new MvcRouteHandler())
        {
                      Domain = domain;
        }
        

        接下来,如果您覆盖了 GetRouteData 方法,您必须在 RouteData 返回值中返回 DataTokens。为了弄清楚这一点,我不得不查看 Route.cs 源代码(谢谢 JAVA2S)。

        RouteData data = new RouteData(...);
        RouteValueDictionary dataTokens = DataTokens;
        if (this.DataTokens != null) {
           RouteValueDictionary rdDataTokens = rd.DataTokens;
           foreach (var token in dataTokens)
              rdDataTokens.Add (token.Key, token.Value);
           }
        }
        return data;
        

        现在只需按照 Fleents 的帖子将您的命名空间放入 dataTokens["Namespaces"] 中即可。

        问候, 达里尔

        【讨论】:

        • 很久以前...我认为您正在使用 Maarten B. 的课程,对吗?如上所示添加命名空间对我不起作用。然后将它们作为 RouteValueDictionary 添加到 RouteValueDictionary 中。我目前正在扩展它,以拥有一个子域到区域路由。
        • 肯定是很久以前...以至于我什至不知道最初的问题是什么或我正在解决什么。 =)
        猜你喜欢
        • 1970-01-01
        • 2012-08-28
        • 2015-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多