这个问题是我在尝试回答 another question 时注意到的结果。现在我很想知道为什么 <asp:TextBox runat="server" Visible="<%= true %>" /> 会导致编译错误,而不是像我预期的那样导致可见的 TextBox。

从我目前发现的情况来看,<%= %> 表达式并没有像我一直认为的那样转换为文字控件。但是,当页面呈现时,它会被评估并直接写入 HtmlTextWriter。但显然解析器(我不确定这是将 ASP.NET 标记转换为 .NET 代码的部分的正确术语)甚至不会尝试评估 <%= %> 表达式,当它们用作服务器控件的属性值时。它只是将它用作字符串。我想这就是我收到错误消息的原因:无法从其字符串表示形式 '' 为 'Visible' 属性创建类型为 'System.Boolean' 的对象。

如果我放弃 runat="server"并将 <%= %> 与常规 html 标记结合起来,如下所示:

<input type="button" id="Button1" visible='<%= true %>' />

然后解析器只是将块在表达式之前和之后分成几部分,然后将其写入渲染方法中的 HtmlTextWriter。像这样的东西:
    __w.Write("<input type=\"button\" id=\"Button1\" visible='");
    __w.Write(true);
    __w.Write("' />");

作为我注意到的最后一件事......当我尝试使用 <%# %> + Control.DataBind() 时,我得到了我所期望的。它连接了控件数据绑定(bind)时要使用的表达式,但与 表达式不同的是,生成的代码实际上计算的是 <%# %> 表达式的内容。解析器最终生成以下内容:
[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 的新问题),还是有充分的理由不允许我们像那样使用 <%= %>

最佳答案

这:

<asp:Button runat="server" id="Button1" visible='<%= true %>' />

不评价这个:
<asp:Button runat="server" id="Button1" visible='true' />

直接输出到响应流,asp 标记不是响应流的一部分。假设 运算符对 asp 标记执行任何类型的预处理是错误的。

顺便说一句,考虑 和 运算符的 ASP.NET 生命周期会有所帮助。
  • 与为对象赋值的语义更相似。在 ASP.NET 生命周期中, 运算符在页面将第一个字节写入响应缓冲区之前进行评估。
  • 与 Response.Write 的意思相同。我们需要首先执行所有数据绑定(bind)和表单处理,并在 ASP.NET 生命周期的最后将 HTML 输出到响应缓冲区。
  • 关于asp.net - 为什么 <%= %> 表达式作为服务器控件上的属性值会导致编译错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/370201/

    10-16 20:58