我如何拦截所有在Umbraco 7中有一个基本控制器父路径的路由?
本文关键字:控制器 路径 路由 有一个 何拦截 Umbraco | 更新日期: 2023-09-27 18:18:24
我已经在Umbraco路由劫持和使用IContentFinder和IUrlProvider周围看了看,我仍然有点迷失在如何做我想做的。
我有一个控制器,它与我在Umbraco中有一个基页的文档类型相匹配。
我创建了一个名为Ads的文档类型和一个名为AdsController: RenderMvcController的控制器
我有一个基本的方法来捕捉这些
public ActionResult Index(RenderModel model)
如果路由如下
美国http://www.example.com/Ads?parent=Cars&孩子=
但是我想让它命中,如果我这样做:
http://www.example.com/Ads/Cars/American很好的MVC路由。我认为内容提供者只让你找到在你的实际树的内容,而这个内容不是。我将在数据库中使用c#找到它,并呈现自定义视图,并使用自定义视图模型返回它。
我知道如何做视图部分。只需要知道如何劫持父路由下的所有路由,这样我的基本控制器方法就可以命中,而不必为每个AD类别类型创建一堆模板或操作方法。
现在不再是测试版,您可以执行以下代码,这将为您提供一个完整的模型,其中包括该页面的umbraco数据:
路线:
public class ApplicationStartup : ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
RouteTable.Routes.MapUmbracoRoute("routename", "Ads/{parent}/{child}", new { controller = "AdsController", action = "Index" }, new PublishedPageRouteHandler(PublishedPageId));
}
处理程序
public class PublishedPageRouteHandler : UmbracoVirtualNodeRouteHandler
{
private readonly int _pageId;
public PublishedPageRouteHandler(int pageId)
{
_pageId = pageId;
}
protected override IPublishedContent FindContent(RequestContext requestContext, UmbracoContext umbracoContext)
{
var helper = new UmbracoHelper(umbracoContext);
return helper.TypedContent(_pageId);
}
}
控制器:
public class AdsController : RenderMvcController
{
public override ActionResult Index(AdModel model)
{
return base.Index(model);
}
}
模型:
public class AdModel : RenderModel
{
public string Parent{ get; set; }
public string Child { get; set; }
public AdModel () : base(UmbracoContext.Current.PublishedContentRequest.PublishedContent)
{
}
}
视图:
@inherits UmbracoViewPage<AdModel>
<h1>@Model.Parent</h1>
当你的应用程序启动时,覆盖ApplicationStarted方法,然后添加你的自定义路由。这样的:
public class ApplicationStartup : ApplicationEventHandler
{
protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
{
//Custom route
RouteTable.Routes.MapRoute(
"Ads",
"Ads/{action}/{id}",
new
{
controller = "Ads",
action = "Index",
id = UrlParameter.Optional
});
}
}
记得添加using Umbraco.Core;