2012-03-18 1 views
2

에서 세션 데이터 부분을 채 웁니다.는 어떻게 드라이버의 HTTP 세션에서 ContentPart를 반환하기 위해 노력하고있어 오차드 CMS

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

에 : 나는 카트 부분을 변경하는 경우

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: cart)); 

는 아무것도 표시되지 않습니다 여기 내 드라이버 및 ContentPart에 대한 코드입니다.

< 문서 클래스 = "컨텐츠 항목 책"모양-ID = "0"> </기사>

답변

5

빈 태그는 일반적으로 백그라운드에서 몇 가지 예외가 있음을 의미 : 나는 빈 문서 태그를 얻을. /App_Data/Logs를 살펴보십시오.

나는 당신이 달성하고자하는 것을 볼 수 있지만, 당신은 다른 그 일을해야했습니다.

콘텐츠 처리기 이벤트 OnLoading을 활용하여 부품 속성에 다양한 소스의 데이터를 채우는 것이 가장 좋습니다. 세션.전체 파트를 세션에 저장하면 특히 파트가 데이터베이스 레코드에 바인딩 될 때 문제가 생길 수 있습니다.

처리기은 모든 준비 작업을 수행해야합니다.

드라이버은 바로 사용할 수있는 부분 (예 : 올바른 모양 선택,보기 모델 준비)에서만 표시/편집기 관련 논리를 유지해야합니다. 따라서 운전자는 대부분의 경우 매우 간단하게 유지되어야합니다.

그래서 귀하의 경우 단계는 다음과 같습니다

  1. 속성을 수화 1 에서 만든 핸들러에서의 ContentHandler
  2. 사용 OnLoading 이벤트에서 파생되는 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.이 주제는 더 자세한 정보가 필요하지만 모든 것이 작동하는 방식에 대해 좀 더 통찰력을 줄 것입니다. –