Asp.net

有沒有辦法以聲明方式將程式碼隱藏屬性值傳遞給伺服器控制項?

  • February 24, 2021

誰能解釋為什麼不能在 ASP.Net 的伺服器控制項聲明中使用內聯程式碼塊?

下面是一個簡單的例子…

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

程式碼塊按字面意思呈現到頁面…

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

我最初的想法是它與頁面生命週期中處理這些事情的順序有關。據我了解,這些<%=...%>塊相當於Response.Write(...)程式碼隱藏中的程式碼。而且由於伺服器控制項實際上並未按照標記中的聲明進行渲染,因此我想在此渲染髮生之前可能無法處理嵌入式程式碼塊。

我將非常感謝任何人能更好地解釋這一點。

然而,數據綁定程式碼塊<%#...%>的行為方式顯然不同,但誰能告訴我為什麼可以將這些嵌入到伺服器控制項中……

....
<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 事件的原因。

希望這將幫助您了解它們之間的區別。

引用自:https://stackoverflow.com/questions/1271191