为了账号安全,请及时绑定邮箱和手机立即绑定

为什么<%=%>表达式作为服务器控件上的属性值会导致编译错误?

为什么<%=%>表达式作为服务器控件上的属性值会导致编译错误?

哆啦的时光机 2019-09-24 09:48:52
这个问题是我在尝试回答另一个问题时注意到的结果。现在<asp:TextBox runat="server" Visible="<%= true %>" />我很想知道为什么会导致编译错误,而不是我期望的那样导致可见的TextBox。从我到目前为止发现的内容来看,这些<%= %>表达式没有像我一直认为的那样转换为文字控件。但是取而代之的是在呈现页面时对其进行评估并直接将其写入HtmlTextWriter。但是很显然,当解析器<%= %>用作服务器控件的属性值时,解析器(我不确定这是将ASP.NET标记转换为.NET代码的部分的正确术语)甚至没有尝试评估表达式。它只是将其用作字符串。我猜这是我收到错误消息的原因:无法从其字符串表示形式'<%= true%>'为'Visible'属性创建'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;这是<%# %>表达式的结果。所以我的问题是..为什么第一个示例中的表达式只是作为字符串处理,而不是被评估为“ true”。对于其他两个示例,这些表达式有些相似,并且它们产生我所期望的代码。这仅仅是一个错误(我怀疑这是错误,因为它不是当前版本的ASP.NET的新问题),还是有充分的理由为什么我们不允许这样使用<%= %>?
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

必须两次阅读此答案才能理解要点:直接输出到响应流,并且asp标记也不是响应流的一部分<%=true%>也不会出现在<asp:Button visible属性中,而是无关紧要的!

查看完整回答
反对 回复 2019-09-24
  • 2 回答
  • 0 关注
  • 477 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信