2017-09-11 2 views
0

에 전달 될 때 코드 유일한 구성 요소 데이터 소스 속성 내가 내 자신의 아코디언 코드 전용 구성 요소DotVVM - 모음이

여기에 내가 list of article sections를로드 중계기를 내보기는이 null입니다. 각 기사 섹션은 list of articles입니다. 그래서 나는 모든 기사 섹션이 articles을 포함 할 자신의 아코디언을 갖게 될 것을 성취하고자합니다. 그게 전부는 왜 repeater

<div class="box box-primary"> 
    <dot:Repeater DataSource="{{value: AccordionList}}"> 
     <ItemTemplate> 
      <coc:Accordion DataSource="{{value: Articles}}"></coc:Accordion> 
     </ItemTemplate> 
    </dot:Repeater>  
</div> 

아코디언 코드 전용 구성 요소에 있습니다. 내 DataSource은 분명히 알 수 있더라도 AccordionListList of Articles이 포함되어 있지만 null이 아니지만 내 DataSource으로 전달되지 않습니다. AccordionListArticleListDTO으로 변경하고 내 Accordion 구성 요소에 직접 전달하면 제대로 작동하지만 원하는 것은 아닙니다.

public class Accordion : HtmlGenericControl 
{ 
    public Accordion() : base("div") 
    { 
    } 
    public static readonly DotvvmProperty DataSourceProperty; 
    static Accordion() 
    { 
      DataSourceProperty = DotvvmProperty.Register<List<ArticleListDTO>, Accordion>(c=>c.DataSource); 
    } 
    //DataSource is always null 
    public List<ArticleListDTO> DataSource 
    { 
     get => (List<ArticleListDTO>)GetValue(DataSourceProperty); 
     set => SetValue(DataSourceProperty, value); 
    } 

    protected override void AddAttributesToRender(IHtmlWriter writer, IDotvvmRequestContext context) 
    { 
     Attributes.Add("class", "accordion"); 

     base.AddAttributesToRender(writer, context); 
    } 

    public void DataBind(IDotvvmRequestContext context) 
    { 
     Children.Clear(); 
     foreach (var item in DataSource) 
     { 
      DataBindItem(this, item, context); 
     } 
    }....etc 

뷰 모델

public List<ArticleSectionListDTO> AccordionList { get; set; } = new List<ArticleSectionListDTO>(); 
public List<ArticleSectionListDTO> AccordionListUnsorted { get; set; } = new List<ArticleSectionListDTO>(); 

protected override void OnItemLoading() 
{ 
    AccordionListUnsorted = Task.Run(() => articleSectionFacade.GetAllNotModifiedArticleSections()).Result; 

    AccordionList = Task.Run(() => articleSectionFacade.CreateTree(AccordionListUnsorted, null)).Result.ToList(); 
} 

DTO들 - 내가 만드는 속성의 나머지 부분을 삭제 분명히

public class ArticleListDTO 
{ 
    public string Name { get; set; } 

    public int? ParentArticleId { get; set; } 
    public bool HasCategories => AssignedToArticle?.Count > 0; 
    public List<ArticleListDTO> AssignedToArticle { get; set; } 
    //Can contain sub articles 
    public List<ArticleListDTO> Articles { get; set; } = new List<ArticleListDTO>(); 
} 

public class ArticleSectionListDTO : ListDTO 
{ 
    public string Name { get; set; } 

    public int? ParentArticleSectionId { get; set; } 
    public bool HasCategories => AssignedToMenuItem?.Count > 0; 
    public List<ArticleSectionListDTO> AssignedToMenuItem { get; set; } 
    public List<ArticleListDTO> Articles { get; set; } = new List<ArticleListDTO>(); 
} 

답변

1

문제는 Repeater 아마 클라이언트 렌더링 모드를 (그것이 기본이다)을 사용한다는 것입니다 . 는 HTML을 렌더링 할 때,이 같은 렌더링 :

템플릿이 렌더링
<div data-bind="foreach: something"> 
    <!-- template --> 
</div> 

, 그 DataContextnull는 (템플릿 항목에서 데이터를 포함 할 수 없습니다 변경할 수 없기 - 그것은 템플릿입니다). RepeaterRenderSettings.Mode="Server"를 추가하여 서버 렌더링

  1. 켭니다

    그래서 여기에 두 가지 옵션이 있습니다.

  2. DataContext이 null 일 때 DataBind를 호출하지 않도록 컨트롤을 업데이트하십시오.