如何在Umbraco中创建虚拟节点

Fel*_*ruz 3 umbraco umbraco7

情况

我在Umbraco 7.3中创建了一个新的部分,我可以在其中管理目录(创建,编辑和删除产品).当我创建产品时,我将其所有信息存储在Umbraco数据库的表中.请注意,我不在树中创建节点,我只是直接使用数据库.

例如,当我在该目录中创建"产品A"时,我会自动在数据库的表中生成并存储自定义URL"/ products/product-A".但是,该URL不存在,因为我没有物理节点:

网页未找到

没有umbraco文档与url'/ products/product-A'匹配.

由于我没有物理节点,我如何"创建" 虚拟节点并为该URL分配模板?

Fel*_*ruz 13

我最终可以搞清楚这一点.谢谢您的回答!

1.为我们的虚拟页面创建一个类

首先是创建一个ProductVirtualPage继承自的类PublishedContentWrapped.最后一个类为IPubslihedContent包装和扩展另一个的实现提供了一个抽象基类IPublishedContent.我们将使用属性的产品,以获得Product从Razor视图和渲染.

public class ProductVirtualPage : PublishedContentWrapped
{   
  private readonly Product _product;

  public ProductVirtualPage(IPublishedContent content, Product product ) : base(content)
  {
     if (product.Name == null) throw new ArgumentNullException("productName");
     _product = product;
  }

   public Product Product
   {
       get
       {
           return _product;
       }
   }
 }
Run Code Online (Sandbox Code Playgroud)

2.基于创建我们的处理程序 UmbracoVirtualNodeRouteHandler

在树中我们需要创建一个引用节点,在我的例子中它具有id 3286.我们将ProductVirtualPage(nodeReference, product)FindContent()调用方法时将它传递给方法.

public class ProductVirtualNodeRouteHandler : UmbracoVirtualNodeRouteHandler
{
    private ProductService _productService;

    protected override IPublishedContent FindContent(RequestContext requestContext, UmbracoContext umbracoContext)
    {
        // Get the real Umbraco IPublishedContent instance as a reference point
        var nodeReference = new UmbracoHelper(umbracoContext).TypedContent(3286);

        //Get the product Id from the URL (http://example.com/Products/product/57)
        var productId = umbracoContext.HttpContext.Request.Url.Segments[3];

        // Create an instance for the ProductService
        _productService = new ProductService(new ProductRepository(), new SiteRepository());

        // Get the product from the database
        var product = _productService.GetById(Convert.ToInt32(productId));

        // Get the virtual product
        return  new ProductVirtualPage(nodeReference, product);
    }
}
Run Code Online (Sandbox Code Playgroud)

3.注册我们的自定义路线

我们需要使用自定义路由MapUmbracoRoute并将其绑定到ApplicationStarted提供的方法ApplicationEventHandler.

public class ContentServiceEventsController : ApplicationEventHandler
{

    protected override void ApplicationStarted(UmbracoApplicationBase umbracoApplication,
        ApplicationContext applicationContext)
    {
        // Add a route for the Products
        RouteTable.Routes.MapUmbracoRoute(
            "ProductPage",
            "Products/Product/{id}/",
            new
            {
                controller = "Product",
                action = "GetProduct"
            },
            new ProductVirtualNodeRouteHandler());
    }
}
Run Code Online (Sandbox Code Playgroud)

4.创建控制器

控制器将返回视图,通过我们的RenderModel model.

public class ProductController : RenderMvcController
{
    public ActionResult GetProduct(RenderModel model, int id)
    {
        return View("Product", model);
    }
}
Run Code Online (Sandbox Code Playgroud)

5.观点

@{
  Layout = "~/Views/Shared/_MasterLayout.cshtml";
  var productModel = Model.Content.Product;
  var product = productModel as Product; 
}
<pre>
  Product Info
  ---------------

  Id: @product.Id
  Name: @product.Name
</pre>
Run Code Online (Sandbox Code Playgroud)