我需要将网站移植到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。
答案 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。
请注意,实际页面名称无关紧要。