Asp.net
有沒有辦法以聲明方式將程式碼隱藏屬性值傳遞給伺服器控制項?
誰能解釋為什麼不能在 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 事件的原因。希望這將幫助您了解它們之間的區別。