58

我一直在使用像 <%=whatever %> 这样的服务器标签来设置 runat="server" 控件的可见性,如下所示:

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

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

    MiId.Visible = MyVisiblePropertyOnCodeBehind

提前致谢,

汤姆

[编辑]解决方案:

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

我的错不止一件事。

在 VS2010 项目中,我们使用 <%# 而不是 <%=

另外,我没有注意到在 VS2010 项目中,我们使用的页面不是从“Page”继承,而是从 CustomPage 类继承,它会自动进行绑定,而我没有注意到它,这让我认为这是一个框架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() 会降低应用程序的性能。你知道多少钱吗?这是否可以理解为在大型项目中使用的“专业”技术,还是您认为应该避免?

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

4

5 回答 5

80

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

解析器错误消息:无法从“Visible”属性的字符串表示“<%=MyVisiblePropertyOnCodeBehind%>”创建类型为“System.Boolean”的对象。

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

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

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

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

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

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

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

于 2012-03-07T06:53:03.450 回答
3

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

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

史蒂文·郑

Microsoft MSDN 在线支持主管

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

和解决方法在这里:ASP.net 内联表达式问题

于 2012-03-07T06:45:55.980 回答
2

只需在 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 %>" 
于 2012-03-07T07:43:48.260 回答
2

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

<div style='<%=MyVisiblePropertyOnCodeBehind ? "" : "display: none" %>' >
    Content
</div>
于 2013-10-22T09:35:14.163 回答
0

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

protected void Page_Load(object sender, EventArgs e){
   MyId.Visible = MyVisiblePropertyOnCodeBehind;
} 

<div id="MyId" runat="server">Content</div>
于 2020-11-02T09:49:49.643 回答