7

我有一个 Web 用户控件,其中有一些控件需要从底层页面的变量或属性中获取一些数据。

<%@ Control Language="C#" AutoEventWireup="False" CodeFile="Header.ascx.cs" Inherits="Site.UserControls.Base.Header" %>
<asp:Literal runat="server" Text='<%# Testing %>' id="ltrTesting" />

代码隐藏

namespace Site.UserControls.Base
{
    public partial class Header : UserControlBase
    {
        public string Testing = "hello world!";

        protected void Page_Load(object sender, EventArgs e)
        {
            //this.DataBind(); // Does not work
            //PageBase.DataBind(); // Does not work
            //base.DataBind(); // Does not work
            //Page.DataBind(); // Does not work
        }
    }
}

我确实阅读了这个主题,但它不能解决我的问题,我认为这是因为这是一个用户控件而不是页面。我想从后面的代码中获取属性值

4

4 回答 4

14

解决了这个,下面的解决方案

由于我在这种情况下使用了 Web 用户控件,因此通常的场景不起作用。但是,通过在控制用户控件的页面或 Web 用户控件上方链中的任何母页中放置数据绑定,代码开始工作

MasterPage 代码隐藏

public partial class MasterPages_MyTopMaster : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Databind this to ensure user controls will behave
        this.DataBind();
    }
}

Ascx 文件,以下所有建议的解决方案都有效

<%@ Control Language="C#" AutoEventWireup="False" CodeFile="Header.ascx.cs" Inherits="Site.UserControls.Base.Header" %>
1: <asp:Literal runat="server" Text='<%# DataBinder.GetPropertyValue(this, "Testing") %>' />
2: <asp:Literal runat="server" Text='<%# DataBinder.Eval(this, "Testing") %>' />
3: <asp:Literal runat="server" Text='<%# Testing2 %>' />

ascx 的代码隐藏

namespace Site.UserControls.Base
{
    public partial class Header : UserControlBase //UserControl
    {
        public string Testing { get { return "hello world!"; } }
        public string Testing2 = "hello world!";

        protected void Page_Load(object sender, EventArgs e)
        { }
    }
}

谢谢你的灵感!

于 2012-01-16T20:39:55.250 回答
7

您通常不能将 scriplet 放在服务器控件中。但是有一个简单的解决方法:使用普通的 html 控件:

<span id="ltrTesting"><%= this.Testing %></span>
于 2012-01-16T16:49:24.193 回答
1

或者您可以在后面的代码中设置 Literal 的 Text 属性:

ltrTesting.Text = "Hello World!";
于 2012-01-16T16:52:37.973 回答
0

尝试使测试成为属性而不是字段:

例如

public string Testing
{
    get { return "Hello World!"; }
}
于 2012-01-16T16:51:05.913 回答