ASP.NET C#ListBox服务器控件不会禁用

ASP.NET C#ListBox服务器控件不会禁用

问题描述:

我有4个服务器端ListBox控件。他们都将他们的Enabled属性设置为false,但是在渲染时它们肯定是启用的。他们都是多重选择。这些没有数据绑定或触摸它们后面的任何代码。以下是所有人的标记(保存ID)。我使用IIS6运行.NET Framework的v4。ASP.NET C#ListBox服务器控件不会禁用

<asp:ListBox runat="server" ID="lstProduct" Enabled="false" SelectionMode="Multiple" Rows="6"></asp:ListBox> 

这里是由运行时生成的标记:

<select size="6" name="ctl00$ctl00$MainContent$MainContent$lstProduct" multiple="multiple" id="MainContent_MainContent_lstProduct" class="aspNetDisabled"> 
+0

如果您在浏览器中查看源代码,是否按照您的预期控制渲染? – Kendrick 2010-09-14 13:59:55

+0

HTML源代码没有disabled =“disabled”,但所有其他标记都是正确的。但是,它确实包含了class =“aspNetDisabled”,但是那个类没有任何我的样式表或任何由ASP.NET注入的地方。 – 2010-09-14 14:22:36

我找到了解决方案。在web.config的<system.web>部分中,您必须添加<pages controlRenderingCompatibilityVersion="3.5">

使用Asp.net 4.0,当设置了Control.Enabled = false时,任何不需要特定用户输入(文本框或密码)的控件都不会使用disabled="disabled"属性呈现。

+1

任何人都知道这个行为在ASP.net 4中被添加了吗? – Jeremy 2015-03-16 22:45:56

试试这个:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!this.IsPostBack) 
    { 
    this.lstProduct.Attributes.Add("disabled", ""); 
    } 
} 

要删除它,你可以仅仅删除禁用的标签是这样的:

this.lstProduct.Attributes.Remove("disabled"); 
+0

这个救了我。 +1在我身边:) – 2014-01-20 11:58:10

更好的解决方案是从ListBox类继承,然后重写SupportsDisabledAttribute财产。详细信息可以在MSDN library

例如找到

public class MyListBox : ListBox 
{ 
    public override bool SupportsDisabledAttribute { get { return true; } } 
} 

您可能希望禁用选择框内的选项,因为这样可以滚动。

//Listbox cannot be disabled directly, instead the inners should be disabled instead. 
foreach(ListItem item in lbCategory.Items) 
{ 
    item.Attributes.Add("disabled", "disabled"); 

    if (item.Selected) 
    { 
     //cannot reliably style with [disabled='disabled'][selected='selected'] or :checked:selected etc, so need a class 
     item.Attributes.Add("class", "disabledSelected"); 
    } 
} 

然后我使用下面的CSS,所以用户仍然可以看到预先选择的项目。

/* Slightly lighter colour than the normal #3399FF because you cannot change the foreground color in IE, so means that it isn't contrasted enough */ 
select option.disabledSelected { background-color: #97cbff !important} 

不幸的是从我的初步调查这是一个有点疼痛的样式在一个不错的跨浏览器的方式禁用的输入元素。我已经为我的目的安排了一堂课,但是这个article regarding styling disabled form elements might help。您可能还会注意到,在IE中,点击事件仍然会被触发,这似乎取消了选择,但仅限于尝试使用[disabled ='disabled'] [selected ='selected']或者某些组合的选项:检查:选中等。

这应该被视为.Net框架中的一个错误。

http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770141表示:未进行用户输入而设计(例如,标签控制)不再呈现禁用=“禁用”属性,如果他们的启用属性设置为false

控制(或如果它们从容器控件继承此设置)。

另请参阅在http://msdn.microsoft.com/en-us/library/system.web.ui.control.renderingcompatibility.aspx处更改(呈现有效html)的基本原理。

但一个列表框被设计用于用户输入和功能已停用属性是HTML的支持,所以它应该呈现disabled="disabled"

你可以使用一个小jQuery作为一个bandaid,直到它被正确地修复。如果你把这个地方,我们运行的所有网页,将修复它为所有残疾人列表框上的所有网页:

$(document).ready(function() { 
    $("select.aspNetDisabled").attr('disabled', 'disabled'); 
}); 

写在的.cs以下行文件

ListBox.Attributes.Add(“已禁用“,”真“);

我有同样的问题,但CheckBoxList

将其Enabled属性设置为false并未禁用它。它在里面的面板在Enabled = false也不会对它产生影响。

解决方法是在CheckBoxList中的项目上使用foreach循环。

foreach (var item in checkBoxList.Items.Cast<ListItem>()) 
{ 
    item.Enabled = false; 
}