【发布时间】:2010-09-27 01:53:53
【问题描述】:
这个问题是我在尝试回答 another question 时注意到的结果。现在我很想知道为什么<asp:TextBox runat="server" Visible="<%= true %>" /> 会导致编译错误,而不是像我预期的那样导致可见的文本框。
从我目前的发现来看,<%= %> 表达式并没有像我一直想的那样被翻译成文字控件。但相反,它在呈现页面时被评估并直接写入 HtmlTextWriter。但显然解析器(我不确定这是将 ASP.NET 标记转换为 .NET 代码的部分的正确术语)甚至没有尝试评估 <%= %> 表达式,当它们用作服务器的属性值时控制。它只是将其用作字符串。我猜这就是我收到错误消息的原因:无法从“可见”属性的字符串表示“”创建类型为“System.Boolean”的对象。
如果我改用 runat="server" 并将 <%= %> 与常规 html 标记相结合,如下所示:
<input type="button" id="Button1" visible='<%= true %>' />
然后解析器只是将块在表达式之前和之后分成几部分,然后在 render 方法中将其写入 HtmlTextWriter。像这样的:
__w.Write("<input type=\"button\" id=\"Button1\" visible='");
__w.Write(true);
__w.Write("' />");
作为我注意到的最后一件事......当我尝试使用<%# %> + Control.DataBind() 时,我得到了我所期望的。当控件是数据绑定时,它连接要使用的表达式,但与 表达式不同,生成的代码实际上计算 <%# %> 表达式的内容。解析器最终生成以下内容:
[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;,它是<%# %> 表达式的结果。
所以我的问题是.. 为什么第一个示例中的表达式只是被视为一个字符串,而不是被评估为“真”。其他两个示例的表达式有些相似,它们产生了我预期的代码。
这只是一个错误(我怀疑这不是当前版本的 ASP.NET 的新问题),还是有充分的理由不允许我们像那样使用<%= %>?
【问题讨论】: