果园路由规则

Posted

技术标签:

【中文标题】果园路由规则【英文标题】:Orchard routing rule 【发布时间】:2014-07-25 14:31:01 【问题描述】:

如何将其“翻译”到果园

routes.MapRoute(
    name: "Durandal App Views",
    url: "App/views/viewName.cshtml",
    defaults: new  controller = "DurandalView", action = "Get" 
);

我尝试根据this 制作主题。

它不起作用并破坏了所有 Orchard 站点

    public class Routes : IRouteProvider 
    public void GetRoutes(ICollection<RouteDescriptor> routes) 
        foreach (var routeDescriptor in GetRoutes())
            routes.Add(routeDescriptor);
    

    public IEnumerable<RouteDescriptor> GetRoutes()
    
        return new[] 
            new RouteDescriptor 
                Priority = 5,
                Route = new Route(
                    "/App/views/viewName.cshmtl",
                    new RouteValueDictionary 
                        "area", "Durandal",
                        "controller", "DurandalView",
                        "action", "Get"
                    ,
                    new RouteValueDictionary(),
                    new RouteValueDictionary 
                        "area", "Durandal"
                    ,
                    new MvcRouteHandler())
            
        ;
    
`

【问题讨论】:

它是如何不起作用的,它是如何破坏网站的? 你也可以给我们看看你的控制器吗? 【参考方案1】:

看起来,您正在主题中创建控制器。 为什么不先尝试将其构建为模块。 浏览一些教程不会有什么坏处,因为 Orchard 强大的可扩展性功能需要一些时间来调整。 Orchard Tutorials 话虽如此,... 1. 创建模块 2. 添加您的路由 3. 创建您的获取操作 4. 在模块的Views 文件夹下获取您的视图,可能在一个名为DurandalView 的文件夹中,如控制器。

然后你就可以调用视图了。你为什么不试试return View(viewName); 你也可以看看这个相关的问题关于如何调用不同的视图SO Question。在那里,您将能够看到为什么您的 ~/App/Views.. 将永远无法工作。或不适用于实际的文件夹结构。

【讨论】:

是的,我不知道为什么,但是当我将它作为模块制作时它可以工作?!! 您可能需要阅读 MVC(约定优于配置?),主题也不是为此而设计的。【参考方案2】:

其实你看看这个

Route = new Route("/App/views/viewName.cshmtl", .... 

您的视图文件名后跟.cshmtl,而它应该是.cshtml 尝试更改文件类型,应该可以。

【讨论】:

【参考方案3】:

这是请求的控制器代码

[Themed]
public class DurandalViewController : Controller

    private readonly IContentManager _contentManager;
    private readonly IWorkContextAccessor _workContextAccessor;
    public DurandalViewController(IContentManager contentManager, IWorkContextAccessor workContextAccessor, IShapeFactory shapeFactory, IOrchardServices services)
    
        _contentManager = contentManager;
        _workContextAccessor = workContextAccessor;
        Shape = shapeFactory;
        Services = services;
        T = NullLocalizer.Instance;
    

    dynamic Shape  get; set; 
    public IOrchardServices Services  get; private set; 
    public Localizer T  get; set; 


    [HttpGet]
    public ActionResult Get(string viewName)
    
        return View("~/App/views/" + viewName + ".cshtml");
    

    //public ActionResult Display(int id)
    //
    //    var contentItem = _contentManager.Get(id, VersionOptions.Published);
    //    dynamic model = _contentManager.BuildDisplay(contentItem);
    //    var ctx = _workContextAccessor.GetContext();
    //    ctx.Layout.Metadata.Alternates.Add("Layout_Null");
    //    return new ShapeResult(this, model);
    //

果园别名模块启用

请求 http://localhost:30321/OrchardLocal/Themes/Durandal/App/views/shell.cshtml 给出 404 并且没有调用任何控制器

当优先级设置为 100 作为 exmp 时,它会完全阻止 Orchard

【讨论】:

您的控制器在主题中吗?在任何 .NET 项目中,波浪号将始终有效,直到 'localhost:30321/OrchardLocal'。所以你缺少“主题/Durandal/”。也就是说,如果可行的话。我以前从未尝试过从主题调用控制器中的视图。【参考方案4】:

@ErMasca 这是复制粘贴错误 实际上代码是正确的 - .cshtml

new RouteDescriptor 
                Priority = -15,
                Route = new Route(
                    "/App/views/viewName.cshtml",
                    new RouteValueDictionary 
                        "area", "Durandal",
                        "controller", "DurandalView",
                        "action", "Get"
                    ,
                    new RouteValueDictionary(),
                    new RouteValueDictionary 
                        "area", "Durandal"
                    ,
                    new MvcRouteHandler())
            

【讨论】:

以上是关于果园路由规则的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloudGateway路由转发顺序控制;路由规则;查看所有路由规则

Springcloud zuul 路由配置规则

thinkphp 规则路由

Zuul路由转发规则

Thinkphp 6.0路由的变量规则和闭包

Vue路由匹配规则routes中的name属性