2012-03-18 64 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