我有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
?
在页面或用户控件中,它看起来像什么?
答案 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上调用它应该是好的。