根级别的Umbraco和动态URL内容

时间:2017-08-02 09:37:56

标签: asp.net url-routing umbraco

我需要将网站移植到asp.net,并决定使用Umbraco作为底层CMS。

我遇到的问题是我需要保留当前网站的网址结构。

当前的网址模板如下所示

domain.com/{brand}/{product}

由于它与网站上的所有其他内容混合在一起,因此很难制定路线。与domain.com/foo/bar不同,它不是品牌或产品。

我编写了IContentFinder,并将其注入Umbraco管道,检查网址结构并确定domain.com/{brand}是否与网站上的任何已知品牌匹配,其中如果我按内部路线domain.com/products/找到内容,并将{brand}/{model}作为HttpContext Items传递,并使用IContentFinder返回。

这有效,但也意味着没有调用MVC控制器。所以现在我离开了从cshtml文件中的数据库获取,这不是那么漂亮,并且打破了MVC约定。

我真正想要的是获取网址domain.com/{brand}/{product}并将其重写为domain.com/products/{brand}/{product},然后根据参数品牌和产品点击提供内容的ProductsController。

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。

这取决于您的内容设置。如果您的产品在Umbraco中以页面形式存在,那么我认为您走的是正确的道路。

在您的内容搜索器中,请务必设置您在请求中找到的页面request.PublishedContent = content;

然后您可以利用路由劫持来添加将为该请求调用的ProductController:https://our.umbraco.org/Documentation/Reference/Routing/custom-controllers

示例实施:

protected bool TryFindContent(PublishedContentRequest docReq, string docType)
{
    var segments = docReq.Uri.GetAbsolutePathDecoded().Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries);
    string[] exceptLast = segments.Take(segments.Length - 1).ToArray();

    string toMatch = string.Format("/{0}", string.Join("/", exceptLast));

    var found = docReq.RoutingContext.UmbracoContext.ContentCache.GetByRoute(toMatch);
    if (found != null && found.DocumentTypeAlias == docType)
    {
        docReq.PublishedContent = found;
        return true;
    }

    return false;
}

public class ProductContentFinder : DoctypeContentFinderBase
{
    public override bool TryFindContent(PublishedContentRequest contentRequest)
    {
        // The "productPage" here is the alias of your documenttype
        return TryFindContent(contentRequest, "productPage");
    }
}

public class ProductPageController : RenderMvcController {}

在示例中,文档类型的别名为“productPage”。这意味着控制器需要完全命名为“ProductPageController”并继承RenderMvcController。

请注意,实际页面名称无关紧要。