【发布时间】:2017-02-22 16:31:33
【问题描述】:
我有一个这样的解决方案结构:
MyApp.Core
--Properties
--References
--bin
--Events
|EventHandlers.cs
--Directory
--Controllers
|DirectoryController.cs
--Helpers
|ContextHelpers.cs
--Models
|DirectoryModel.cs
--AnotherSite
--Controllers
--Helpers
--Models
--Services
--Shared
--Controllers
|HomePageController.cs
--Helpers
|Extensions.cs
|app.config
|packages.config
MyApp.Umbraco
--Properties
--References
--bin
etc........
--Views
--Directory
--Partials
|DirectoryFilters.cshtml
|DirectoryBase.cshtml
|DirectoryHome.cshtml
|FDirectory.cshtml
|SDirectory.cshtml
--Partials
--Shared
|Base.cshtml
|Web.config
etc........
我的 Umbraco 实例使用我的“核心”项目中的模型和控制器。存在嵌套的目录结构,因为一个安装中有多个网站,在“Core”中,以及在 Umbraco 实例的“Views”目录中。
我对 .NET MVC 还是很陌生,而且我了解路由劫持,但 Umbraco 路由的文档很少。我有以下内容:
EventHandlers.cs
namespace MyApp.Core.Events
{
/// <summary>
/// Registers site specific Umbraco application event handlers
/// </summary>
public class MyAppStartupHandler : IApplicationEventHandler
{
public void OnApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
public void OnApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
RegisterCustomRoutes();
}
public void OnApplicationStarting(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
}
private static void RegisterCustomRoutes()
{
// Custom Routes
RouteTable.Routes.MapUmbracoRoute(
"FDirectory",
"fdirectory/{id}",
new
{
controller = "Directory",
action = "FDirectory",
id = UrlParameter.Optional
},
new PublishedPageRouteHandler(1000));
RouteTable.Routes.MapUmbracoRoute(
"SDirectory",
"sdirectory/{id}",
new
{
controller = "Directory",
action = "SDirectory",
id = UrlParameter.Optional
},
new PublishedPageRouteHandler(1001));
RouteTable.Routes.MapUmbracoRoute(
"HomePage",
"",
new
{
controller = "HomePage",
action = "Index",
id = UrlParameter.Optional
},
new PublishedPageRouteHandler(1002));
}
}
public class PublishedPageRouteHandler : UmbracoVirtualNodeRouteHandler
{
private readonly int _pageId;
public PublishedPageRouteHandler(int pageId)
{
_pageId = pageId;
}
protected override IPublishedContent FindContent(RequestContext requestContext, UmbracoContext umbracoContext)
{
if (umbracoContext != null)
{
umbracoContext = ContextHelpers.EnsureUmbracoContext();
}
var helper = new UmbracoHelper(UmbracoContext.Current);
return helper.TypedContent(_pageId);
}
}
}
DirectoryController.cs
namespace MyApp.Core.Directory.Controllers
{
public class DirectoryController : RenderMvcController
{
public DirectoryController() : this(UmbracoContext.Current) { }
public DirectoryController(UmbracoContext umbracoContext) : base(umbracoContext) { }
public ActionResult FDirectory(RenderModel model)
{
return CurrentTemplate(new DirectoryModel(model.Content));
}
public ActionResult SDirectory(RenderModel model)
{
return CurrentTemplate(new DirectoryModel(model.Content));
}
}
}
所以 Umbraco 没有安装 App_Start 文件夹。我想知道多站点安装 Umbraco 以注册到控制器的路由的最佳方法是什么。我的实现有效,但似乎我不应该为我将在站点中的每个页面、每个控制器中创建操作。我知道 Umbraco 有自己的路由,所以使用 Umbraco 概念、ASP.NET MVC 概念以及任何其他可用的方法,实现这种解决方案结构的最佳方法是什么?我是否应该担心使用 RouteConfig.cs 并创建 App_Start 目录?还是我正在做的最好的方法?我应该使用 IApplicationEventHandler 还是 ApplicationEventHandler?
另外,我必须对节点 ID 进行硬编码。我读过有一种动态的方法?这样的例子会很棒。
实施结构化多站点 Umbraco MVC 解决方案的最佳方法示例是我想的,关于路由控制器,提供一些细节或指向强大示例的链接。我进行了搜索和研究,那里有一些零碎的东西,但并不是我正在使用的一个很好的例子。我将不得不为我此时创建的每个页面创建一个 RouteMap,我不知道这是否是最有效的方法。我什至尝试实现一个 DefaultController,但是当您的解决方案将有多个控制器时,我没有看到这一点。
【问题讨论】:
标签: c# asp.net-mvc model-view-controller umbraco umbraco7