2012-03-18 63 views
2

我试图从驱动程序中的HTTP会话中返回一个ContentPart。这里是我的司机和ContentPart代码:如何在Orchard CMS中使用会话数据填充零件

public class UnpersistedPartDriver : ContentPartDriver<UnpersistedPart> 
{ 
    public Localizer T { get; set; } 
    private readonly IHttpContextAccessor _httpContextAccessor; 

    public UnpersistedPartDriver(IHttpContextAccessor httpContextAccessor) { 
     T = NullLocalizer.Instance; 
     _httpContextAccessor = httpContextAccessor; 
    } 

    /// <summary> 
    /// This method is responsible for displaying your part in the frontend. 
    /// </summary> 
    /// <param name="part">Your part.</param> 
    /// <param name="displayType"></param> 
    /// <param name="shapeHelper"></param> 
    /// <returns></returns> 
    protected override DriverResult Display(UnpersistedPart part, string displayType, dynamic shapeHelper) 
    { 
     var session = _httpContextAccessor.Current().Session; 
     var cart = session["Cart"] as UnpersistedPart; 
     if (cart == null) { 
      cart = new UnpersistedPart(); 
      session["Cart"] = cart; 
     } 

     return ContentShape("Parts_Jumpstart_Unpersisted", 
      () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: part)); 
    } 

    // There is nothing to edit and update, so we don't need Editor methods. 
} 
public class UnpersistedPart : ContentPart 
{ 
    public UnpersistedPart() 
    { 
     this.Items = new List<Item>(); 
     this.Items.Add(new Item { Id = 1, Title = "Book 1", Price = "130.00", Quantity = "1" }); 
     this.Items.Add(new Item { Id = 2, Title = "Book 2", Price = "145.00", Quantity = "2" }); 
     this.Items.Add(new Item { Id = 3, Title = "Book 3", Price = "150.00", Quantity = "3" }); 
    } 

    public IList<Item> Items; 
    public string Total 
    { 
     get 
     { 
      return Items.Sum(i => i.Total).ToString(); 
     } 
    } 
    public string SessionId; 
} 

[Serializable] 
public class Item 
{ 
    public int Id; 
    public string Title; 
    public string Price; 
    public string Quantity; 
    public decimal Total { get { return decimal.Parse(Price) * int.Parse(Quantity); } } 
} 

当我改变部分购物车:

return ContentShape("Parts_Jumpstart_Unpersisted", 
      () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: part)); 

到:

return ContentShape("Parts_Jumpstart_Unpersisted", 
      () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: cart)); 

它不会显示任何内容。我得到一个空的文章标签:

<文章类=“内容项书”形状-ID =“0”> < /条>

回答

5

空标签通常意味着在后台的一些例外。 请查看/ App_Data/Logs。

我明白你想达到什么目的,但你应该以不同的方式做。

最佳实践是利用OnLoading内容处理程序事件来填充来自不同来源的数据的零件属性,例如,会话。在会话中存储整个零件肯定会让您在某个时候遇到麻烦,特别是当零件绑定到数据库记录时。

处理程序应执行所有准备操作。

驱动程序应该只在显示/编辑器相关的准备就绪的部分(如选择正确的形状,准备视图模型)的逻辑。所以司机应该在大部分时间保持简单。

所以你的情况的步骤将是:

  1. 创建CartHandler类,从的ContentHandler
  2. 使用OnLoading事件在1 创建的处理程序派生来滋润财产/ ies与来自会话的数据。

例子:

public class CartHandler : ContentHandler 
{ 
    public CartHandler(IHttpContextAccessor context) 
    { 
     this.OnLoaded<UnpersistedPart>(ctx, part => 
     { 
      var session = context.GetCurrent().Session; 
      // Here comes loading data from session 

      part.MyProperty = session["Something"]; 
      // ........ 
     }); 
    } 
} 

此事件将被调用每次它包含的内容项将被装载,显示它之前的时间。所以在驱动程序中,您将收到一个完整的部分。

添加一个处理程序之后,你的驱动显示方法看起来方式更简单:

protected override DriverResult Display(UnpersistedPart part, string displayType, dynamic shapeHelper) 
{ 
    return ContentShape("Parts_Jumpstart_Unpersisted", 
     () => shapeHelper.Parts_Jumpstart_Unpersisted(ContentPart: part)); 
} 
+0

什么彼得说的是对的,不整ContentPart存储在您的会议,这是更好的存储一个标识符 – rfcdejong 2012-03-18 15:43:08

+0

谢谢你。 orchardcms中是否有任何模块可以显示这些内容。我无法找到有关已加载事件的任何文档。 – 2012-03-18 20:49:33

+2

这是一些关于处理程序的信息:http://docs.orchardproject.net/Documentation/Understanding-content-handlers。这个主题会让你更深入地了解一切如何运作,尽管需要一些更详细的信息。 – 2012-03-18 21:05:49