ASP UpdatePanel 内的砌体布局

Posted

技术标签:

【中文标题】ASP UpdatePanel 内的砌体布局【英文标题】:Masonry Layout inside ASP UpdatePanel 【发布时间】:2021-11-01 15:40:19 【问题描述】:

我在我的 ASP-WebPage 上使用了一个 UpdatePanel,它带有下拉菜单和 Output-Div 卡片,这些卡片是在 CodeBehind 中生成的,由 Masonry 布局。输出绑定到下拉列表。

在 PageLoad 上,砌体布局运行良好。当 Dropdown 更改时,布局会丢失,并且卡片之间会出现空格。

我尝试在 output-div 发生变化后启动 masonry-object 的布局方法。似乎没有在 UpdatePanel 中运行。

有人可以给我一个冲动,我怎么能意识到,砌体布局在更新面板更改后再次发挥作用?

这就是我使用它的方式:

<asp:ScriptManager runat="server" EnablePageMethods="false"/>
        <asp:UpdatePanel runat="server">
            <ContentTemplate>
               <asp:DropDownList OnSelectedIndexChanged="ddKat_SelectedIndexChanged" OnDataBound="ddKat_DataBound" ID="ddKat" CssClass="form-control" runat="server" DataSourceID="SqlDataSource1" DataTextField="name" DataValueField="id" AutoPostBack="true">
            </asp:DropDownList>
            <asp:SqlDataSource runat="server" ID="SqlDataSource1" ConnectionString='<%$ ConnectionStrings:comidosDElocalConnectionString %>' SelectCommand="SELECT [id], [name] FROM [kategorien] order by name"></asp:SqlDataSource>
               <div class="wrapper" id="wrapper">
                <!-- Start Blog Masonry Area -->
                <section class="blog__masonery__area bg--white section-padding--lg">
                    <div class="container blog__masonry__container">
                        <div class="row blog__masonery__wrap" id="ausgabe" runat="server">

                        </div>
                    </div>
                </section>
                <!-- End Blog Masonry Area -->     
            </div><!-- //Main wrapper -->
            </ContentTemplate>
        </asp:UpdatePanel>

protected void Page_Load(object sender, EventArgs e)
    
        if(!Page.IsPostBack)
        
            List<kategorien> listeKategorien = myKATEGORIE.holeKategorienMitContent();
            foreach (var item in listeKategorien)
            
                ausgabeNav.Controls.Add(erzeugeNavZuKategorie_id(item));
            
        
    


protected void ddKat_SelectedIndexChanged(object sender, EventArgs e)
    
        bestückeAusgabeCards();
    



private void bestückeAusgabeCards()
    
        List<FREE.konzepte> listeDBfürDROPDOWN = new List<FREE.konzepte>();
        using (comidosDElocalEntities context = new comidosDElocalEntities())
        
            listeDBfürDROPDOWN = context.konzepte.ToList();
        
        foreach (var item in listeDBfürDROPDOWN)
        
            if (item.kategorie_id.ToString() == ddKat.SelectedValue)
            
                // 1. VERSION
                // ausgabeCards.Controls.Add(erzeugeCard(item));
                // ". VERSION: MASONRY
                ausgabe.Controls.Add(erzeugeBlogEintragMasonry(item));
            
        
    


    public static htmlGenericControl erzeugeBlogEintragMasonry(konzepte konzeptItem)
    
        HtmlGenericControl rückgabe = new HtmlGenericControl("div");
        rückgabe.Style["padding-bottom"] = "10px";
        rückgabe.Attributes["class"] = "col-lg-4 col-md-6 col-sm-12 bl__item cat--1";
        HtmlGenericControl zweitesDiv = new HtmlGenericControl("div");
        zweitesDiv.Attributes["class"] = "blog__masonry foo";
        HtmlGenericControl bildBereich = new HtmlGenericControl("div");
        bildBereich.Attributes["class"] = "bl__maso__thumb";
        HtmlGenericControl linkUmBild = new HtmlGenericControl("a");
        linkUmBild.Attributes["href"] = konzeptItem.startseitePfad;
        HtmlGenericControl bild = new HtmlGenericControl("img");
        bild.Attributes["src"] = konzeptItem.bildPfad;
        bild.Attributes["alt"] = konzeptItem.überschrift;
        bild.Attributes["title"] = konzeptItem.überschrift;
        linkUmBild.Controls.Add(bild);
        bildBereich.Controls.Add(linkUmBild);
        zweitesDiv.Controls.Add(bildBereich);
        HtmlGenericControl textBereich = new HtmlGenericControl("div");
        textBereich.Attributes["class"] = "bl__mass__content";
        HtmlGenericControl titel = new HtmlGenericControl("h4");
        titel.Style["line-height"] = "auto";
        titel.Style["text-align"] = "center";
        titel.Style["font-weight"] = "bold";
        titel.Style["padding-top"] = "5px";

        titel.InnerHtml = konzeptItem.überschrift;
        textBereich.Controls.Add(titel);
        HtmlGenericControl p = new HtmlGenericControl("p");
        p.InnerHtml = konzeptItem.beschreibung;
        p.Style["text-align"] = "center";
        textBereich.Controls.Add(p);
        zweitesDiv.Controls.Add(textBereich);
        // LINKS
        HtmlGenericControl linkBereich = new HtmlGenericControl("div");
        linkBereich.Attributes["class"] = "linkBereich";
        linkBereich.Style["text-align"] = "center";
        HtmlGenericControl linkEins = new HtmlGenericControl("a");
        linkEins.Style["display"] = "inline-block";
        linkEins.Style["margin-bottom"] = "5px";
        linkEins.Attributes["target"] = "_blank";
        linkEins.Attributes["href"] = konzeptItem.startseitePfad;
        linkEins.InnerHtml = "zur Live-Vorschau";
        linkEins.Attributes["class"] = "btn btn-primary blogLink";
        linkEins.Attributes["title"] = "zur Live-Vorschau";
        linkBereich.Controls.Add(linkEins);
        zweitesDiv.Controls.Add(linkBereich);
        rückgabe.Controls.Add(zweitesDiv);
        return rückgabe;
    

是否有任何意见可以在某些事件中调用 Masonry 的布局方法,即在更新面板更改时触发。或者当更新面板内的输出 div 发生变化时调用客户端代码的任何其他意见?

【问题讨论】:

【参考方案1】:

当您使用 UpdatePanel 时,其中的所有内容都会刷新,这会更改 DOM 以及对其进行的所有绑定。所以你需要再次执行 jQuery 来重新创建 Masonry。

把他的代码放在某个地方,它就会工作。

<script>
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    //when the updatepanel is finished reloading
    prm.add_endRequest(function () 
        initMyMasonry();
    );

    //the normal first time page load
    initMyMasonry();

    function initMyMasonry() 
        //crteate your masonry here
    
</script>

【讨论】:

以上是关于ASP UpdatePanel 内的砌体布局的主要内容,如果未能解决你的问题,请参考以下文章

隐藏面板内的 ASP.NET updatepanel 可能存在错误

JQuery 数据表和 ASP.NET UpdatePanel

Bootstrap 4 - 结合网格系统的砌体布局(二、三、四和六列布局)[重复]

UpdatePanel??????????????????

没有预定义宽度的响应式砌体布局

ASP.NET UpdatePanel:在 UpdatePanel 更新上注入 Javascript