我可以在最后看出这一点。谢谢您的回答!
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 –