這個問題是我在嘗試回答另一個問題時注意到的結(jié)果。現(xiàn)在<asp:TextBox runat="server" Visible="<%= true %>" />我很想知道為什么會導(dǎo)致編譯錯誤,而不是我期望的那樣導(dǎo)致可見的TextBox。從我到目前為止發(fā)現(xiàn)的內(nèi)容來看,這些<%= %>表達(dá)式?jīng)]有像我一直認(rèn)為的那樣轉(zhuǎn)換為文字控件。但是取而代之的是在呈現(xiàn)頁面時對其進(jìn)行評估并直接將其寫入HtmlTextWriter。但是很顯然,當(dāng)解析器<%= %>用作服務(wù)器控件的屬性值時,解析器(我不確定這是將ASP.NET標(biāo)記轉(zhuǎn)換為.NET代碼的部分的正確術(shù)語)甚至沒有嘗試評估表達(dá)式。它只是將其用作字符串。我猜這是我收到錯誤消息的原因:無法從其字符串表示形式'<%= true%>'為'Visible'屬性創(chuàng)建'System.Boolean'類型的對象。如果我改為拋棄runat =“ server”并將其<%= %>與常規(guī)html標(biāo)記合并,如下所示:<input type="button" id="Button1" visible='<%= true %>' />然后,解析器只將塊在表達(dá)式之前和之后拆分,然后將其寫入render方法中的HtmlTextWriter。像這樣: __w.Write("<input type=\"button\" id=\"Button1\" visible='"); __w.Write(true); __w.Write("' />");作為我注意到的最后一件事...當(dāng)我嘗試使用<%# %>+ Control.DataBind()時,我得到了期望的結(jié)果。它連接了將控件綁定到數(shù)據(jù)時要使用的表達(dá)式,但與<%=%>表達(dá)式不同,生成的代碼實際上會評估該<%# %>表達(dá)式的內(nèi)容。解析器最終生成以下內(nèi)容:[DebuggerNonUserCode]private Button __BuildControldataboundButton(){ Button button = new Button(); base.databoundButton = button; button.ApplyStyleSheetSkin(this); button.ID = "databoundButton"; button.DataBinding += new EventHandler(this.__DataBindingdataboundButton); return button;}public void __DataBindingdataboundButton(object sender, EventArgs e){ Button button = (Button) sender; Page bindingContainer = (Page) button.BindingContainer; button.Visible = true;}從:<asp:Button ID="databoundButton" Visible='<%# true %>' runat="server" />注意,button.Visible = true;這是<%# %>表達(dá)式的結(jié)果。所以我的問題是..為什么第一個示例中的表達(dá)式只是作為字符串處理,而不是被評估為“ true”。對于其他兩個示例,這些表達(dá)式有些相似,并且它們產(chǎn)生我所期望的代碼。這僅僅是一個錯誤(我懷疑這是錯誤,因為它不是當(dāng)前版本的ASP.NET的新問題),還是有充分的理由為什么我們不允許這樣使用<%= %>?
為什么<%=%>表達(dá)式作為服務(wù)器控件上的屬性值會導(dǎo)致編譯錯誤?
哆啦的時光機(jī)
2019-09-24 09:48:52