我如何拦截所有在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 7中有一个基本控制器父路径的路由?

现在不再是测试版,您可以执行以下代码,这将为您提供一个完整的模型,其中包括该页面的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;