2017-09-11 9 views
0

に渡されたとき、コード成分のみDataSourceプロパティがnullである私は自分のアコーディオンコードのみの構成要素を持っているDotVVM - コレクションは

ここでは、私はlist of article sectionsをロードリピーターを持って私の見解です。各記事のセクションは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は、私がはっきりと見ても、AccordionListにはList of Articlesが含まれていますが、それは決してnullではありませんが、私のDataSourceに渡されることはありません。 AccordionListのタイプをArticleListDTOに変更し、それを直接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 

のViewModel

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 - 私は(それがデフォルトです)問題はRepeaterは、おそらくクライアントレンダリングモードを使用することであることは明らか

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

作るために残りのプロパティを削除。それはHTMLをレンダリングするとき、それはこのようなものをレンダリング:

テンプレートがレンダリングされる
<div data-bind="foreach: something"> 
    <!-- template --> 
</div> 

、そのDataContextnullがある(テンプレートは項目のデータを含んではならないbecasue - それがテンプレートです)。

だから、ここで2つのオプションがあります。RepeaterRenderSettings.Mode="Server"を追加することで、サーバーのレンダリング上

  1. 電源を入れます。
  2. DataContextがnullの場合、DataBindを呼び出さないようにコントロールを更新します。
関連する問題