我可以在最後看出這一點。謝謝您的回答!
1.創建一個類爲我們的虛擬頁
第一件事情就是創建一個類即ProductVirtualPage
從PublishedContentWrapped
繼承。這最後一類爲IPubslihedContent
實現提供了一個抽象基類,它實現了另一個IPublishedContent
的換行和擴展。我們將使用產品以從剃刀視圖中獲取Product
並進行渲染。
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;
}
}
}
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);
}
}
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());
}
}
4.創建控制器
控制器將只返回查看,通過我們RenderModel model
。
public class ProductController : RenderMvcController
{
public ActionResult GetProduct(RenderModel model, int id)
{
return View("Product", model);
}
}
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>
首先,非常感謝你的時間和指導我在正確的方向。 現在的事情是,我的產品視圖 - 需要傳遞一個'產品'模型 - 從共享佈局視圖繼承 - 需要接收'RenderModel'模型,這會導致衝突。 請看下面的要點,你可以在評論中看到更詳細的解釋: https://gist.github.com/felipecruz91/9291fe25892d8c7f4cf2#file-productvirtualnoderoutehandler-cs-L31 –