刚以前同事Q问我    <asp:Literal ID="lss" runat="server" Text="<%=d%>"></asp:Literal>这样写为什么不对怎么取不到值啊
后台  public string d = "s";
    protected void Page_Load(object sender, EventArgs e)
    {
        d = "11dasssssss";
    }
结果: 运行后Literal 的值为空
技术群有的说什么不能二次编译,
有的说Literal 本身就是读取
我认为都没说到本质上,
求大侠说说 在服务器控件中不能用<%=value%>绑定值得根本原因是什么

解决方案 »

  1.   

    我记得<%=d%>这种形式要用在客户端组件中,不能用在服务端组件
      

  2.   

    也不对,如果是这种,值应该就是<%=d%>">
      

  3.   

    验证了,是对的
        <form id="form1" runat="server">
         <%=d%> 
        <div>
             
    <asp:literal runat="server" Text="<%=d%>"></asp:literal>
        </div>
        </form>   
    html
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
    <head><title></title></head>
    <body>
        <form method="post" action="Default.aspx" id="form1">
    <div class="aspNetHidden">
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMTIwMzgwMDM0ZGS6CntZpDuNP9JNrPhvjMfSe05vURysX7oGDt/3qLfhGg==" />
    </div>     doad 
        <div>
             
    <%=d%>
        </div>
        </form>
    </body>
    </html>
    </body>
    </html>
      

  4.   

    估计renderHTML的时候他直接取的Text的值,没料到还有人。
      

  5.   

    还是后台literal直接赋值吧,我挺喜欢literal 和Repeater的。
      

  6.   

    目测是因为 可能放在updatepanel里面没有及时刷新,或者是在弹出窗口中.
      

  7.   

    <%=%>只是在页面输出,不能做服务器端的控件解释,起作用的只有Bind 和 Eval
      

  8.   

    直接在后台lss.Text = "sssss";
      

  9.   

    private string d;        public string D
            {
                get { return d; }
                set { d= value; }
            }
      protected void Page_Load(object sender, EventArgs e)
      {
      this.D = "11dasssssss";
      } <asp:Literal ID="lss" runat="server" Text="<%=this.D%>"></asp:Literal>这样才能取到
      

  10.   

    the following explanation from internet:<% %> is simply short for <script runat="server"> </script> aka code render blocks.<%# %> are binding expressions (plus the above).<%= %> is the above + a Response.Write().<%: %> is the above + a Response.Write() wrapped in Html.Encode (new in .NET 4.0).<%$ %> is an ASP.NET expression, used to bind configuration or resource file data during runtime.
      

  11.   

    你只要还是用<%=%>输出 那你后边怎么写都不好使!
      

  12.   

    后台 用静态的 public static string d = "s";
      protected void Page_Load(object sender, EventArgs e)
      {
    if(!ispostback)
    {
      d = "11dasssssss";
    }
      }
      

  13.   


    我感觉啊 
    因为后台cs代码先执行,所以先创建对象Literal ,再给Literal 的text属性赋值 “<%=d%>”(string);
    然后aspx页面的Literal.text为string类型的,值为“<%=d%>”已经不是代码执行块了。锁一在实行完cs代码,执行aspx里页面的代码块时,不执行,没有可执行的代码区域。。
      

  14.   

    你要用<%#%>具体原因。执行的方式与时间不一样<%#%>个人认为执行时间要早于<%=> 与解释模版(parsetemplate())
      

  15.   

    对于<%=>这种方式,.net是在编译时将其替换为表达式,这是在render中处理的
    对于服务器空间中的<%=>,则为左处理,只是把它作为控件的值,不加处理
      

  16.   

    后台用str保存:  protected StringBuilder str = new StringBuilder(); 
    前台输出:<%= str.ToString() %>
    这样也可以
    type = Request.QueryString["type"];
    <form id="uploadForm" action='File.ashx?type=<%=type %>'>
      

  17.   

    应该和服务器端控件呈现时间和生命周期有关,<%=d%>其中的d值应该是在整个页面生命周期结束后才会有值,而服务器控件呈现时间要早于该过程,导致用该方法赋值时d的值还没有生成。
    个人理解,不知道对不对!
      

  18.   

    同意32楼的观点,服务器控件在生命周期,在加载这一步骤的时候,控件已经加载好其属性了
    而 <%= %>应该是属于呈现步骤。
      而你现在就好像要从呈现到加载,这本身就是不合理的。