gpt4 book ai didi

c# - 正确路由到Umbraco ASP.NET/IApplicationEventHander与ApplicationEventHandler与RouteConfig.cs,RenderMvcController等中的 Controller 的正确方法

转载 作者:行者123 更新时间:2023-12-01 19:48:03 25 4
gpt4 key购买 nike

我有一个这样的解决方案结构:

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实例的“ Core”中以及“ 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,但是当您的解决方案将具有多个控制器时,却没有意识到这一点。

最佳答案

我不确定您要达到的目标,但是我将尽力解释其工作原理,也许您以后可以进行澄清。

我假设您已经了解了Umbraco的基础知识(创建文档类型+根据文档类型创建文档)。这就是通常使用Umbraco的方式,它将为您在站点中创建的每个这些“内容节点”(文档)自动为您进行路由。

因此,创建一个名为document1的文档,它将自动在您的站点中的URL:http://localhost/document1处路由。默认情况下,该文档将通过默认的MVC控制器提供,并且全部在幕后进行,而您无需执行任何操作。

路由劫持可让您覆盖此默认行为,并“推入”控制器,该控制器可让您干预请求的处理方式。要使用劫持,请使用文档类型的别名创建一个RenderMvcController。可能是HomePageController : RenderMvcController

该控制器应具有以下签名的操作:

public override ActionResult Index(RenderModel model)


在此操作中,您可以按照自己喜欢的任何方式修改发送到视图的模型。那可能是-获取一些外部数据以添加到模型或触发一些逻辑或您需要执行的任何操作。

命名约定自动将所有这些连接起来,并且您无需手动注册任何路由即可起作用。

您可以创建的另一种Umbraco MVC控制器是 SurfaceController。这个通常用于处理子动作和表单提交(HttpPost)。 SurfaceController也会由Umbraco自动路由,并将位于“不太漂亮”的URL上。但是,由于通常只用于渲染子动作并进行表单提交,所以实际上它什么都没用,所以它位于哪个URL上并不重要。

除了这些自动路由控制器之外,您当然也可以像在任何标准MVC网站中一样注册自己的MVC控制器。但是,一个区别是,与普通的ASP.NET MVC网站不同,Umbraco站点不具有控制器的自动默认注册功能,允许在创建新控制器时路由“正常工作”。

因此,如果您希望在Umbraco站点中呈现一个普通的旧MVC控制器而不与Umbraco中的文档/节点相关,则必须像在其他MVC站点中一样为它注册一个路由。最好的方法是使用 ApplicationEventHandler类将其连接并添加到Routes中。这将在应用程序启动期间自动触发-本质上允许您执行通常在 App_Start中执行的操作。

只是要清楚一点-如果您打算使用Umbraco的数据,则不应使用普通的MVC控制器,也不需要进行任何手动路由注册。通常,您需要在Umbraco中创建的文档/节点的上下文中渲染模板/视图(可以在其中修改文档的数据/属性),然后采用路由劫持的方式。



从外观上看,似乎正确的方法是创建两种文档类型:

FDirectorySDirectory

您单击以允许在根目录中创建这两个文件,然后创建名为 FDirectorySDirectory的文档,它们将自动在这些URL上发送。然后,创建一个称为 RenderMvcControllerFDirectoryController : RenderMvcController将确保在请求该页面时将其用于劫持路由。

如果您只是想建立一个多站点解决方案,建议您在Umbraco内容树的根目录中创建一个 Website文档类型,并为所需的每个站点创建一个节点。右键单击每个节点,然后将主机名编辑为您需要的名称。如果您需要在本地主机上测试而不使用多个主机名,它也可以是一些“子URL”,例如 /fdirectory/sdirectory

希望这能为您提供所需的指针,否则尝试解释您要尝试的操作,我将看看是否可以进一步完善我的答案!

关于c# - 正确路由到Umbraco ASP.NET/IApplicationEventHander与ApplicationEventHandler与RouteConfig.cs,RenderMvcController等中的 Controller 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42397136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com