情况
我在Umbraco 7.3中创建了一个新的部分,我可以在其中管理目录(创建,编辑和删除产品).当我创建产品时,我将其所有信息存储在Umbraco数据库的表中.请注意,我不在树中创建节点,我只是直接使用数据库.
题
例如,当我在该目录中创建"产品A"时,我会自动在数据库的表中生成并存储自定义URL"/ products/product-A".但是,该URL不存在,因为我没有物理节点:
网页未找到
没有umbraco文档与url'/ products/product-A'匹配.
由于我没有物理节点,我如何"创建" 虚拟节点并为该URL分配模板?
Fel*_*ruz 13
我最终可以搞清楚这一点.谢谢您的回答!
首先是创建一个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)
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)
我们需要使用自定义路由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)
控制器将返回视图,通过我们的RenderModel model.
public class ProductController : RenderMvcController
{
public ActionResult GetProduct(RenderModel model, int id)
{
return View("Product", model);
}
}
Run Code Online (Sandbox Code Playgroud)
@{
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)
| 归档时间: |
|
| 查看次数: |
2270 次 |
| 最近记录: |