.... 代码块按字面意思呈现到页面... 我最初的想法是这与页-6ren">
gpt4 book ai didi

asp.net - 有没有办法以声明方式将代码隐藏属性值传递给服务器控件?

转载 作者:行者123 更新时间:2023-12-02 08:53:56 25 4
gpt4 key购买 nike

谁能解释一下为什么不能在 ASP.Net 的服务器控件声明中使用内联代码块?

下面是一个简单的例子...

....
<form id="form1" runat="server">
<asp:Label ID="Label1" runat="server" Text="<%= SomeProperty %>"></asp:Label>
</form>
....

代码块按字面意思呈现到页面...

<span id="Label1"><%= SomeProperty %></span>

我最初的想法是这与页面生命周期中处理这些事情的顺序有关。 <%=...%>据我了解, block 相当于 Response.Write(...)在代码隐藏中。而且由于服务器控件实际上并未按照标记中声明的方式呈现,因此我认为在此呈现发生之前可能无法处理嵌入的代码块。

如果有人能更好地解释这一点,我将非常感激。

但是,数据绑定(bind)代码块<%#...%>它的行为方式显然不同,但是谁能告诉我为什么可以将它们嵌入到服务器控件中......

....
<asp:Repeater id=Repeater1 runat="server">
....
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Eval(“SomeProperty”) %>'></asp:Label>
</ItemTemplate>
....
</asp:Repeater>
....

这很好用。

最佳答案

您对 <%=...%> 的看法基本上是正确的句法。以下是幕后发生的情况的示例:

<script runat="server">
public string SomeProperty { get { return "Hello World!"; } }
</script>

<form id="form1" runat="server">
<%= SomeProperty %>
<div>
<asp:Label ID="Label1" runat="server" Text="<%= SomeProperty %>"></asp:Label>
</div>
</form>

这将被解析并创建以下 C# 代码(我对其进行了一些简化):

private Label @__BuildControlLabel1() 
{
Label @__ctrl = new Label();

this.Label1 = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "Label1";
@__ctrl.Text = "<%= SomeProperty %>";
return @__ctrl;
}

private void @__Renderform1(HtmlTextWriter @__w, Control parameterContainer)
{
@__w.Write( SomeProperty );
@__w.Write("\r\n <div>\r\n ");
parameterContainer.Controls[0].RenderControl(@__w);
@__w.Write("\r\n </div>\r\n ");
}

以下是 <%#...%> 幕后发生的情况的示例语法:

<script runat="server">
public string SomeProperty { get { return "Hello World!"; } }
protected void Page_Load(object sender, EventArgs e) { Label1.DataBind(); }
</script>

<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="<%# SomeProperty %>"></asp:Label>
</div>
</form>

生成此代码:

private Label @__BuildControlLabel1() 
{
Label @__ctrl = new Label();

this.Label1 = @__ctrl;
@__ctrl.ApplyStyleSheetSkin(this);
@__ctrl.ID = "Label1";
@__ctrl.DataBinding += new System.EventHandler(this.@__DataBindingLabel1);
return @__ctrl;
}

public void @__DataBindingLabel1(object sender, EventArgs e)
{
Label dataBindingExpressionBuilderTarget = ((Label)(sender));
Page Container = ((Page)(dataBindingExpressionBuilderTarget.BindingContainer));

dataBindingExpressionBuilderTarget.Text = System.Convert.ToString( SomeProperty , System.Globalization.CultureInfo.CurrentCulture);
}

如您所见 <%=...%>语法可以在服务器控件的属性之外使用,以直接呈现返回值。另一方面 <%#...%>语法为标签的 DataBinding 事件生成事件处理程序。此事件将标签属性的值设置为 SomeProperty 的值。每当调用 DataBind 方法时都会触发 DataBinding 事件,这就是我将该调用添加到 Page_Load 事件的原因。 希望这将帮助您理解它们之间的区别。

关于asp.net - 有没有办法以声明方式将代码隐藏属性值传递给服务器控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com