1

嗨,stackoverflowers(如果这是一个词!),

我正在尝试使用具有动态属性的用户控件,但无法使其按我想要的方式工作。该控件的目的是拥有通用的 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 方法,但没有任何运气。我需要找到一个解决方案,让我不能以某种方式在代码隐藏中设置控制属性。任何人都可以帮忙吗?

谢谢, 海拉尔

4

1 回答 1

1

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

ASP.NET 用户控件:无法使用 Eval("...") 初始化用户控件属性

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

于 2012-06-13T02:08:31.290 回答