将动态属性绑定到用户控件

本文关键字:用户 控件 绑定 动态 属性 | 更新日期: 2023-09-27 18:37:09

嗨,叠花同胞(如果这是一个词!

正在尝试拥有一个具有动态属性的用户控件,但无法让它按照我想要的方式工作。该控件的目的是具有通用的 AddThis 小部件,设计人员可以将该小部件放在 ASPX 中,而无需开发人员在 ASPX.CS 中执行任何操作。 以前,我只在 ASPX 页的代码隐藏中设置用户控件的动态属性,但现在让程序员和设计人员都参与到这样的简单任务中似乎太麻烦了。

这是我的代码:

用户控制代码 (ASCX):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="AddThisSocial.ascx.cs"
    Inherits="MyWebsite.Controls.AddThisSocial" %>
<!-- Begin AddThis Social Share -->
<div class="addthis_toolbox addthis_default_style" addthis:url="<%=Url%>" addthis:title="<%=Title %>"
    addthis:description="<%=Description%>">
    <%
        if (Facebook)
        {
    %>
    <a class="addthis_button_facebook" title="Send to Facebook" style="margin-top: 5px;">
    </a>
    <%
        }
    %>
    <%
        if (Twitter)
        {
    %>
    <a class="addthis_button_twitter" title="Send to Twitter" style="margin-top: 5px;">
    </a>
    <%
        }
    %>
    <%
        if (Google)
        {
    %>
    <a class="addthis_button_google" title="Send to Google" style="margin-top: 5px;">
    </a>
    <%
        }
    %>
    <%
        if (Pinterest)
        {
    %>
    <a class="addthis_button_pinterest_pinit" style="margin-top: 0px;">
    </a>
    <%
        }
    %>
    <%
        if (CompactButton)
        {
    %>
    <a class="addthis_button_compact" style="margin-top: 5px;"></a>
    <%
        }
    %>
</div>
<!-- End AddThis Social Share -->

用户控制代码 (ASCX.CS):

namespace MyWebsite.Controls
{
    public partial class AddThisSocial : System.Web.UI.UserControl
    {
        #region Public Properties
        public string Url { get; set; }        
        public string Title { get; set; }        
        public string Description { get; set; }        
        public string ImageUrl { get; set; }
        [DefaultValue("False")]        
        public Boolean Facebook { get; set; }
        [DefaultValue("False")]        
        public Boolean Twitter { get; set; }
        [DefaultValue("False")]        
        public Boolean Google { get; set; }
        [DefaultValue("False")]        
        public Boolean Pinterest { get; set; }
        [DefaultValue("False")]        
        public Boolean CompactButton { get; set; }
        #endregion
        #region Page Events
        protected void Page_Load(object sender, EventArgs e)
        {
            // facebook doesn't like addthis attributes - add opengraph attributes seperately
            var page = HttpContext.Current.Handler as Page;
            if (page == null) return;
            if(!String.IsNullOrEmpty(Url))
            {
                var mUrl = new HtmlMeta();
                mUrl.Attributes.Add("property", "og:url");
                mUrl.Attributes.Add("content", Url);
                page.Header.Controls.Add(mUrl);
            }
            if (!String.IsNullOrEmpty(Title))
            {
                var mTitle = new HtmlMeta();
                mTitle.Attributes.Add("property", "og:title");
                mTitle.Attributes.Add("content", Server.HtmlEncode(Title));
                page.Header.Controls.Add(mTitle);
            }
            if (!String.IsNullOrEmpty(Description))
            {
                var mDescription = new HtmlMeta();
                mDescription.Attributes.Add("property", "og:description");
                mDescription.Attributes.Add("content", Server.HtmlEncode(Description));
                page.Header.Controls.Add(mDescription);
            }
            if (!String.IsNullOrEmpty(ImageUrl))
            {
                var mImageUrl = new HtmlMeta();
                mImageUrl.Attributes.Add("property", "og:image");
                mImageUrl.Attributes.Add("content", ImageUrl);
                page.Header.Controls.Add(mImageUrl);
            }
        }
        #endregion
    }
}

ASPX 页面代码的一部分:

<MyWebsite:AddThisSocial runat="server" ID="ProductAddThisSocial" Description="<%# Eval("Description") %>" ImageUrl="<%= GetImageUrl() %>" Facebook="True" Twitter="True" Google="True" CompactButton="True" Pinterest="True" />

以上不起作用,而如果我为控件设置静态字符串,它就可以工作。

<MyWebsite:AddThisSocial runat="server" ID="ProductAddThisSocial" Description="My Description" ImageUrl="My Image Url" Facebook="True" Twitter="True" Google="True" CompactButton="True" Pinterest="True" />

我已经完成了对此的调试,在网络上阅读有关此内容后,这不起作用是有道理的。控件属性不会在父页的加载方法时初始化。我还尝试将属性设置为可绑定并将page_load更改为page_prerender方法,但没有任何运气。我需要找到一个解决方案,使我无法以某种方式在代码隐藏中设置控件属性。谁能帮忙?

谢谢希拉尔

将动态属性绑定到用户控件

看看这些帖子。基本上,您需要利用 Render 方法和 ViewState 来绑定您的属性:

ASP.NET 用户控件:无法使用 Eval("...")

用户控件上的自定义属性难倒