Asp.net mvc 4 DD4T默认路由不工作

Asp.net mvc 4 DD4T默认路由不工作,asp.net-mvc-4,tridion,tridion-2011,dd4t,Asp.net Mvc 4,Tridion,Tridion 2011,Dd4t,我将DD4T框架与SDL Tridion 2011和ASP.NET MVC4一起使用 我有一些非DD4T控制器和视图,我想使用,但我得到了404错误,当我试图去这些网址 这是我的路线表 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // Route for SDL Tridi

我将DD4T框架与SDL Tridion 2011和ASP.NET MVC4一起使用

我有一些非DD4T控制器和视图,我想使用,但我得到了404错误,当我试图去这些网址

这是我的路线表

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Route for SDL Tridion UI 2011 (Aka !SiteEdit)
        routes.MapRoute(
            "SiteEditBlankPage",
            "se_blank.html",
            new { controller = "Empty", action = "Index" });

        routes.MapRoute(
            null, // Route name
            "xml/{*PageId}", // URL with parameters
            new { controller = "Page", action = "Xml" }, // Parameter defaults
           new { pageId = @"^(.*)?$" } // Parameter constraints
        );

        // Tridion page route
        routes.MapRoute(
           "TridionPage",
           "{*PageId}",
           new { controller = "Page", action = "Page" }, // Parameter defaults
           new { pageId = @"^(.*)?$" } // Parameter constraints
        );

        routes.MapRoute(
            null, // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }
我曾尝试将默认路由移到Tridion页面上方,但之后Tridion页面得到404

使其工作的唯一方法似乎是有一条到我的控制器的特定路线,例如:

        routes.MapRoute(
           null, // Route name
           "MyController/{action}/{id}", // URL with parameters
           new { controller = "MyController", action = "Index", id = UrlParameter.Optional } // Parameter defaults
       );
有人有什么想法吗?由于上述解决方案并不理想


(我的web.config中没有任何UI 2012配置)

我们只是在根目录中放置了一个页面se_blank.html,并确保它只部署到staging,因此它位于需要的位置,不需要特定的路由


当然,这并不是真的回答你的问题,但你可以认为这是一个选择。p> 也许您可以制作一个像TridionPage映射到控制器那样的全包映射,该映射将重定向到正确的控制器,并基于参数使用RedirectToAction函数执行操作


不确定这是否是您的理想解决方案。

AFAIC有几个选项:

  • 如果您可以从“普通”url(扩展名、起始路径等)识别Tridion url,您可以通过调整TridionPage路由来解决它。但我认为这对你来说是没有选择的,因为如果你能从正常的url中识别出Tridion url,你就已经想出了这个解决方案;)

  • 在TridOnPage路由上实现路由约束。如果请求的url在代理中,请签入此routeconstraint。如果为true:返回true,否则返回false。如果返回false,则下一个路由(匹配的路由)将处理该请求。 但对性能不太确定

  • 您自己的选择:一个特定的路线为您的正常网页


  • 我肯定我错过了一些选择。希望有人在这里分享

    正常的DD4T操作是让Tridion拥有URL,即捕获所有URL并将其传递给一个PageController。这会干扰基于其名称的控制器/操作的自动路由,因此必须给出其中一个细节

    我个人喜欢阿尔伯特的第一个建议,因为它很简单。例如,仅将以“.html”结尾的URL映射到Tridion。不幸的是,这会导致SGs中的默认页面出现问题,因为无法识别“/sg”,即使代理中可能有“/sg/index.html”。解决这一问题的一些备选方案:

    • 为所有一级结构组(/news、/products等)配置显式路由

    • 将所有Tridion页面发布到网站的一个子部分,例如/内容,并将其映射到特定路线


    我们的解决方案:Tridion不允许在链接中创建带有“mvc”的页面=>我们定义了一个约束,在RouteConfig中忽略带有“mvc”的PageId

    所以:当DD4T收到一个“tridion”页面的请求时,它使用TridionPage路由,当它是一个请求/控制器/操作时,它使用默认的MVC路由

    routes.MapRoute(
    "TridionPage",
    "{PageId}",
    new { controller = "Page", action = "Page" }, //parameter defaults
    new { PageId = @"(?!mvc.)*" } // Parameter constraint: ignore PageId with '/'
    );
    
    //Default MVC route
    routes.MapRoute(
    "MVC", //Route name
    "mvc/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional}
    );
    

    你所说的“正常控制器”是什么意思?我想是非dd4t控制器吧?谢谢,艾伯特。我想我现在可能不得不使用第三种解决方案!如果我想一个更好的方法,我会在这里更新。具体路线+1-这就是我们解决这个问题的方法。显然,你不必在url中有“MyController”!谢谢你,奎林。我不确定我是否能区分Tridion页面和“正常”操作,所以我想我将继续为我的控制器创建路由。那么结构组中的页面呢?它们肯定会包含斜杠吗?