<%#%> UserControls上的DataBind和DataBind

时间:2013-02-14 04:16:31

标签: c# asp.net data-binding

我有System.UI.Web.Page,其中包含user control

我想传递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
在页面或用户控件中,它看起来像什么?

2 个答案:

答案 0 :(得分:1)

这是一个简单的例子,我想这说明了你想要完成的事情。请注意<script runat="server">标记中的所有内容都可以放在代码隐藏中,我只需将它们全部放在一个文件中,以便于阅读。

由于您将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方法中设置属性,然后放弃首页中的<%# %>就更清晰了。我觉得在代码隐藏中设置属性是更常见的方法,但显然选择取决于你。

此外,如果您有兴趣,有关AutoEventWireup="false"的更多信息可以是found on MSDN。查找标题为“当AutoEventWireup属性的值为false时”的部分。

修改

静态属性也可以正常工作。这是一个示例,使用Page.DataBind()作为@nunespascal建议(它也适用于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>

答案 1 :(得分:1)

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

你应该收到你的价值。

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

在页面上调用DataBind会将其调用为页面上的呼叫控件。在Page_Load上调用它应该是好的。