在Framework 3.5中设置服务器标记<%=%>的Visible属性

我一直在.NET Framework 4项目中使用服务器标签(如<%= whatever%>)来设置runat =“server”控件的可见性,如下所示:

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

这适用于框架4,但现在试图在Framework 3.5项目上使用它似乎并不工作。 这是一个仅适用于Framework 4的function吗? 有没有一个最酷的(和.aspx方)替代从代码隐藏设置可见性? 我使用丑陋的:

  MiId.Visible = MyVisiblePropertyOnCodeBehind 

提前致谢,

汤姆

[编辑]解决scheme:

感谢您的意见,使我明白我的问题和解决scheme!

这是我的错,不止一件事。

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

另外,我没有注意到,在VS2010项目中,我们使用的页面不是从“Page”inheritance的,而是从一个CustomPage类自动进行绑定,而我没有注意到它,这让我认为这是一个框架4.0只有function。

正如你在这里所说的,如果你有以下的标记:

  <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()可以降低应用程序的性能。 你有什么想法吗? 这可以理解为一个“专业”的技术,用于大型项目,或者你认为应该避免?

我喜欢这样的方式,它使标记可读性和易于理解的一个单一的看法,但我不想因为这个慢代码犯内疚。

您发布的代码对于ASP.NET 2.0或ASP.NET 4.0运行时中的服务器标记而言是无效的语法。 在任一版本中,尝试在服务器标记中使用<%= ... %>设置可见属性应该导致parsing器错误:

parsing器错误消息:无法从其string表示forms'<%= MyVisiblePropertyOnCodeBehind%>'为'Visible'属性创buildtypes'System.Boolean'的对象。

除了在代码隐藏或<script runat="server">标记中设置Visible属性之外,还有两个选项。 首先是使用Visible属性的数据绑定。 您需要在MyId或其父控件之一上调用DataBind()方法以获取要绑定的值。

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

另一种select是编写代码如下:

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

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

Controls集合不能被修改,因为控件包含代码块(即<%…%>)

所有这一切,我认为只是设置财产的方式,你现在正在做的是要走的路。

只需在你的pageLoad事件中设置一个variables为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 %>" 

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

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

史蒂文

Microsoft MSDN在线支持负责人

完整的post在这里: http : //www.aspnet-answers.com/microsoft/ASP-NET/29389067/dynamically-set-a-control-property.aspx

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

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

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