例如用户控件 GetUserList.ascx
顶部声明:<%@ Register TagPrefix="UC" TagName="GetUserList" Src="Controls/GetUserList.ascx" %>页面调用:<UC:GetUserList ID="GetUserList1" StrWhere="CategoryId=<%=Request.QueryString[0]%>"runat="Server"></UC:GetUserList>
这样写得不到<%=Request.QueryString[0]%>的值
即使换作变量也得不到
<UC:GetUserList ID="GetUserList1" StrWhere="CategoryId=<%=CID%>"runat="Server"></UC:GetUserList>
请问怎么才能够给用户控件传递动态的值呢?

解决方案 »

  1.   

    用get set 来获取 和 设置
      

  2.   

    在GetUserList.ascx里面确实使用get和set设置的,但问题外部传不进来参数。。
    <UC:GetUserList ID="GetUserList1" StrWhere="CategoryId= <%=Request.QueryString[0]%>"runat="Server"> </UC:GetUserList> 
    这个传进来的参数就是StrWhere="CategoryId= <%=Request.QueryString[0]%>";也就是说<%%>里的东西直接被转义成字符串了,而没有作为表达式去执行。
      

  3.   

    你应当使用数据绑定语法,而不是赋值语法。数据绑定是 <%#,不要使用 <%=。你的页面有3个地方:1.页面设计代码上写:
       StrWhere="<# GetCID()%>"
    2. 在页面代码页中要有函数:
        public string GetCID()
       {
            return "CategoryId="+ Request.QueryString[0];
       }3. 在page_load中要有:
        this.DataBind();
      

  4.   

    StrWhere=" <%# GetCID()%>" 
      

  5.   

    不过,要知道你的用户控件被创建和它的StrWhere属性被赋值是两个阶段。我怀疑你在设计这个用户控件是是否想到了这点。你的用户控件是在页面OnInit之前被创建的,那时候根本不可能取到页面的环境参数。你在设计用户控件时必须考虑到这点,在 StrWhere 属性被复制(Set)的时候应该重新刷新它自己的显示。如果没有考虑到这点,你的用户控件就只能在page_load中动态装载才能取到页面环境参数。例如:
    1. 在页面设计上删除
        <UC:GetUserList ID="GetUserList1" ....
    改为
        <asp:PlaceHolder ID="PlaceHolder1" />2. 在page_load中写:  GetUserList c=this.LoadControl("Controls/GetUserList.ascx") as GetUserList;
      if(c!=null)
      {
          c.ID="GetUserList1";
          c.StrWhere="CategoryId="+ Request.QueryString[0]; 
      }
      PlaceHolder1.Controls.Add(c);只有这样,用户控件在page_load执行之前才能已经得到了 StrWhere 参数的值。