在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>