【问题标题】:Set Visible property with server tag <%= %> in Framework 3.5在 Framework 3.5 中使用服务器标记 <%= %> 设置 Visible 属性
【发布时间】:2012-03-24 15:34:08
【问题描述】:

我一直在 .NET Framework 4 项目中工作,使用像 这样的服务器标签来设置 runat="server" 控件的可见性,如下所示:

  <div id="MyId" runat="server" visible="<%=MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

这适用于框架 4,但现在尝试在框架 3.5 项目上使用它似乎不起作用。这是 Framework 4 唯一的功能吗?从代码隐藏设置可见性是否有最酷(和 .aspx 方面)的替代方法?我用的是丑的:

    MiId.Visible = MyVisiblePropertyOnCodeBehind

提前致谢,

汤姆

[已编辑] 解决方案:

感谢您的 cmets 让我了解我的问题和解决方案!

我的错不止一件事。

在 VS2010 项目中,我们使用

另外,我没有注意到在 VS2010 项目中我们使用的页面不是从“Page”继承的,而是从 CustomPage 类继承的,它会自动进行绑定,而我没有注意到它,这让我觉得是 Framework 4.0 独有的功能。

正如您在此处所说,如果您有以下标记:

  <div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
  </div>

你可以让它工作,将以下代码添加到代码隐藏中:

    public bool  MyVisiblePropertyOnCodeBehind = true;
    protected void Page_Load(object sender, EventArgs e) {
        DataBind();
        // Or if you want only for one control, MyId.DataBind();             
    }

据我了解,此 DataBind() 会降低应用程序的性能。你知道多少钱吗?这是否可以理解为在大型项目中使用的“专业”技术,还是您认为应该避免?

我喜欢它使标记在单个视图中可读且易于理解的方式,但我不希望因此而对缓慢的代码感到内疚。

【问题讨论】:

  • 您的“MyVisiblePropertyOnCodeBehind”属性的签名是什么?
  • 其实我觉得在后面的代码中设置它并不难看。如果您想提醒控件不一定可见,请在代码前面将visible="false" 设置为默认值。

标签: asp.net .net visible servertag


【解决方案1】:

您发布的代码对于 ASP.NET 2.0 或 ASP.NET 4.0 运行时中的服务器标记的语法无效。在任一版本中,尝试在服务器标记中使用 &lt;%= ... %&gt; 设置可见属性都会导致解析器错误:

解析器错误消息:无法创建“System.Boolean”类型的对象 从它的字符串表示 '' 对于“可见”属性。

除了在代码隐藏中设置Visible 属性或&lt;script runat="server"&gt; 标记之外,您还有两个选择。第一种是在Visible 属性上使用数据绑定。您需要在 MyId 或其父控件之一上调用 DataBind() 方法才能绑定值。

<div id="MyId" runat="server" visible="<%# MyVisiblePropertyOnCodeBehind %>" >
    Content
</div>

另一种选择是编写代码如下:

<% if(MyVisiblePropertyOnCodeBehind) { %>
<div id="MyId" runat="server">
    Content
</div>
<% } %>

这种方法的缺点是您无法以编程方式将控件添加到页面或包含代码块的控件。如果你尝试,你应该得到一个错误:

无法修改 Controls 集合,因为该控件 包含代码块(即 )

话虽如此,我认为按照您现在的方式设置属性是可行的方法。

【讨论】:

  • 多亏了这个,以及“arunes”消息中的链接,我终于明白了我的问题。谢谢。 (对不起,我是新手,不能投票)。
  • @rsbarro 我发现了另一个使用&lt;% if 块的奇怪之处,因此在回发时会引发验证错误。如果块包含不应呈现的RequiredFieldValidator,则回发仍将使用它,就好像它存在一样并导致验证失败。我发现我仍然必须使用布尔表达式来设置 Enabled='&lt;%# false %&gt;' 并在 Page_Load 后面的代码中调用 someControlId.DataBind(); 以在回发时禁用验证器。
  • 是否可以在用户控件后面的代码中调用this.DataBind();,并使其适用于列表视图和数据网格?像在 OnInit 方法中一样?
【解决方案2】:

对于 ASP.NET aspx 页面的内联表达式。 只能用于 aspx 页面或用户控件的顶级文档级别,但不能嵌入 服务器控件的标签属性(如&lt;asp:Button... Text =&lt;% %&gt; ..&gt;)。 正如您所发现的,您可以在 ASP.NET 2.0 中创建自定义表达式生成器以 添加你的内联表达式。

顺便说一句,另一种为服务器控件属性提供值的方法 aspx inline tempalte 正在使用 数据绑定表达式。这是 内置支持。与其他内联表达式唯一不同的是 目标控件或其容器控件上的方法。

史蒂文·郑

Microsoft MSDN 在线支持主管

全文在这里:http://www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

这里的解决方法:ASP.net Inline Expression Issue

【讨论】:

    【解决方案3】:

    这是另一种方法,可以保持原始问题中代码的简单性。在这里,您必须从 div 标签中删除 runat="server" 并使用 css "display:none" 而不是 "Visible" 属性。这种方法的缺点是标签仍然会被发送到浏览器,即使它不可见并且可见性是在客户端处理的。

    <div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' >
        Content
    </div>
    

    【讨论】:

      【解决方案4】:

      只需像这样在 pageLoad 事件中将变量设置为 true/false

      private bool IsEditMode {get; set;}      
      
      protected bool IsVisible 
      {
          get { retun IsEditMode ;}
          set { IsEditMode =value;}
      }  
      
      protected void Page_Load(object sender, EventArgs e)
      {
          if (!Page.IsPostBack)
          {
              // based on some condition set this to true or false 
              isEditMode=true;
          }
      }   
      

      然后在 aspx 页面内的控件属性中,通过类似的属性设置它们的可见性

      Visible="<%# !IsEditMode %>" 
      

      【讨论】:

      • 对不起,这件事与问题无关,而且代码令人困惑,具有不同的属性名称:(
      • @tomasofen 我已经用正确的命名更新了我的答案。
      【解决方案5】:

      另一种方法是给控件一个 ID 并在代码中设置可见。

      protected void Page_Load(object sender, EventArgs e){
         MyId.Visible = MyVisiblePropertyOnCodeBehind;
      } 
      
      <div id="MyId" runat="server">Content</div>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多