<;%#%>;以及UserControls上的DataBind
本文关键字:DataBind 上的 UserControls gt lt 以及 | 更新日期: 2023-09-27 17:58:58
我有一个包含user control
的System.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
在页面或用户控件中,它是什么样子的?
这里有一个简单的例子,我认为它说明了您试图实现的目标。请注意,<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上调用它应该很好。