繁体   English   中英

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

[英]Set Visible property with server tag <%= %> in Framework 3.5

我一直在一个 .NET Framework 4 项目中工作,使用诸如 <%=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() 会降低应用程序的性能。 你知道多少钱吗? 这是否可以理解为用于大型项目的“专业”技术,或者您认为应该避免使用它?

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

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

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

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

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

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

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

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

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

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

至于 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 Inline Expression Issue

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

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

只需在您的 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 %>" 

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

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

<div id="MyId" runat="server">Content</div>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM