果园路由规则
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())
【讨论】:
以上是关于果园路由规则的主要内容,如果未能解决你的问题,请参考以下文章