2012-03-18 10 views
2

ドライバのHTTPセッションからContentPartを返そうとしています。ここに私のドライバーとContentPartのためのコードは次のとおりです。オーチャード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. は、プロパティを水和するために1 で作成されたハンドラで使用OnLoadingイベント/
  2. のContentHandler
  3. から派生CartHandlerクラスを作成します。セッションのデータを持つ

例:

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

+0

ありがとう。 orchardcmsにこのようなことを示すモジュールがありますか?私はonloadedイベントに関するドキュメントを見つけることができません。 –

+2

ハンドラに関するいくつかの情報があります:http://docs.orchardproject.net/Documentation/Understanding-content-handlers。このトピックでは、より詳細な情報が必要ですが、すべての仕組みについてもう少し詳しく説明します。 –

関連する問題