0

独自のアコーディオン コードのみのコンポーネントがある

これは、ロードするリピーターがある私のビュー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>

アコーディオン コードのみのコンポーネント。MyはDataSource、はっきりとわかる場合でも常に nullです。の型をtoに変更してコンポーネントに直接渡すと、うまくいきましたが、それは私が望むものではありません。AccordionListList of ArticlesDataSourceAccordionListArticleListDTOAccordion

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>();
}
4

1 に答える 1

1

問題は、Repeaterおそらくクライアント レンダリング モードを使用していることです (これがデフォルトです)。HTML をレンダリングすると、次のようにレンダリングされます。

<div data-bind="foreach: something">
    <!-- template -->
</div>

テンプレートがレンダリングされると、それDataContextnull(テンプレートは項目からのデータを含んではならないため、テンプレートです)。

したがって、ここには 2 つのオプションがあります。

  1. RenderSettings.Mode="Server"に追加して、サーバー レンダリングをオンにしますRepeater
  2. DataContextが null の場合に DataBind を呼び出さないように、コントロールを更新します。
于 2017-09-13T15:04:36.657 に答える