【问题标题】:How do I intercept all routes that have a base controller parent path in them in Umbraco 7如何在 Umbraco 7 中拦截所有具有基本控制器父路径的路由
【发布时间】:2014-08-15 16:18:59
【问题描述】:

我已经查看了 Umbraco 路由劫持和使用 IContentFinder 和 IUrlProvider 的所有内容,但我仍然对如何做我想做的事有点迷茫。

我有一个控制器,它与我在 Umbraco 中有一个基页的文档类型相匹配。

我制作了一个名为“Ads”的文档类型和一个名为“AdsController: RenderMvcController”的控制器

我有一个基本的方法来捕捉所有这些

public ActionResult Index(RenderModel模型)

如果路线是这样的话就可以了

http://www.example.com/Ads?parent=Cars&child=American

但如果我这样做,我希望它能够击中:

http://www.example.com/Ads/Cars/American

所以基本上很好的 MVC 路由。我认为内容提供者只能让您找到实际树中的内容,而该内容不是。我将在数据库中使用 C# 找到它并呈现自定义视图并使用自定义视图模型返回它。

我知道如何做视图部分。只需要知道如何劫持父路由下的所有路由,这样我的基本控制器方法就可以命中,而无需为每个 AD 类别类型创建一堆模板或操作方法。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-routing umbraco


    【解决方案1】:

    现在不再处于测试阶段,您可以执行以下代码,这将为您提供包含该页面的 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>
    

    【讨论】:

      【解决方案2】:

      当您的应用启动时,覆盖 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;

      【讨论】:

      • 这取决于您需要执行的操作。但是,如果您查看此our.umbraco.org/forum/templating/templates-and-document-types/…,您会发现在 7.1.5(仍处于测试阶段)中,它们具有新的 mapUmbracoRoute 功能,可让您完全访问 umbraco 树并正确传递 RenderViewModel。我读到这种方式不会完全为你做到这一点。我会将您标记为正确,但 7.1.5 功能更好。
      猜你喜欢
      • 1970-01-01
      • 2017-06-27
      • 2017-05-27
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2021-10-30
      相关资源
      最近更新 更多