<;%#%>;以及UserControls上的DataBind

本文关键字:DataBind 上的 UserControls gt lt 以及 | 更新日期: 2023-09-27 17:58:58

我有一个包含user controlSystem.UI.Web.Page

我想从page to the user control传递一个变量

据我所见,显然我必须使用<%# variable %>DataBind()

但我找不到任何明确的例子来说明这是如何做到的。

通常,当我使用用户控制时,它看起来像:

<UI:YouTube VideoId="XXXXXXXX" runat="server" />

然而,对于这个例子,它看起来像:

<UI:YouTube VideoId="<%# sYouTubeCode %>" runat="server" />

sYouTubeCode是页面代码后面的public string property

如果相关的话,aspx page在引用后面的代码时具有AutoEventWireup="false"

我什么时候做这个databinding
在页面或用户控件中,它是什么样子的?

<;%#%>;以及UserControls上的DataBind

这里有一个简单的例子,我认为它说明了您试图实现的目标。请注意,<script runat="server">标签中的所有内容都可以放在codeehind中,我只是把它们都放在一个文件中,这样更容易阅读。

由于AutoEventWireup设置为false,因此需要重写OnInit方法并连接Load事件处理程序。在Page_Load方法中,您可以将属性的值设置为您想要的任何值(我使用了MyText属性),然后只调用服务器控件上的DataBind(在本例中,我使用了一个Literal控件)。

<%@ Page Language="C#" AutoEventWireup="false" %>
<html>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal ID="litText" Text="<%# MyText %>" runat="server" />
    </div>
    </form>
</body>
</html>
<script runat="server">
    public string MyText { get; set; }
    private void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
        {
            MyText = "some text to databind!";
            litText.DataBind();        
        }
    }
    protected override void OnInit(EventArgs e)
    {
        Load += Page_Load;
        base.OnInit(e);
    }
</script>

FWIW,虽然上面的代码工作得很好,但我确实认为只在Page_Load方法中设置属性,然后放弃首页中的<%# %>更干净。我觉得在codeehind中设置属性是更常见的方法,但显然选择取决于您。

此外,如果您感兴趣,可以在MSDN上找到有关AutoEventWireup="false"的更多信息。查找标题为"当AutoEventWireup属性的值为false时"的部分。

编辑

静态属性也可以正常工作。这里有一个例子,使用@nunespascal建议的Page.DataBind()(它也适用于litText.DataBind())。

<%@ Page Language="C#" AutoEventWireup="false" %>
<html>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Literal ID="litText" Text="<%# MyClass.StaticProp %>" runat="server" />
    </div>
    </form>
</body>
</html>
<script runat="server">
    private void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack)
            Page.DataBind();
    }
    protected override void OnInit(EventArgs e)
    {
        Load += Page_Load;
        base.OnInit(e);
    }
    public class MyClass
    {
        public static string StaticProp { get { return "Static Property"; } }
    }
</script>

只要您在页面上调用DataBind,就可以将值传递给您的用户控件,如VideoId="<%# sYouTubeCode %>"

你应该接受你的价值观。

请注意,DataBinding确实发生在生命周期的后期。就在预渲染之前。

在页面上调用DataBind将为页面上的调用控件调用它。在Page_Load上调用它应该很好。