ASP.NET серверный элемент управления C# ListBox не будет отключен


У меня есть 4 элемента управления ListBox на стороне сервера. Все они имеют свойству Enabled значение false, но при визуализации они определенно включены. Все они являются множественным выбором. Они не имеют привязки данных или какого-либо кода за прикосновением к ним. Ниже приведена разметка для всех из них (сохраните идентификатор). Я запускаю v4 платформы .NET Framework с IIS6.

<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">
8 10

8 ответов:

Я нашел решение. В разделе <system.web> web.config, вы должны добавить <pages controlRenderingCompatibilityVersion="3.5">.

С Asp.net 4.0, любой элемент управления, который не принимает определенный пользовательский ввод (текстовое поле или пароль), не будет отображаться с атрибутом disabled="disabled", Когда Control.Enabled = false установлен.

Попробуйте это:

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

Чтобы удалить его, вы можете просто удалить отключенный тег следующим образом:

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

Лучшим решением является наследование от класса ListBox, а затем переопределение свойства SupportsDisabledAttribute. Подробную информацию можно найти в библиотеке MSDN

Например

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

Напишите следующую строку в поле .cs-файл

Список.Атрибуты.Добавить ("disabled", "true");

Это следует считать ошибкой в .Net Framework.

Http://www.asp.net/whitepapers/aspnet4/breaking-changes#0.1__Toc256770141 говорит:

Элементы управления, не предназначенные для ввода пользователем (например, элемент управления Label), больше не отображают атрибут disabled= "disabled", если их свойство Enabled имеет значение false (или если они наследуют этот параметр от элемента управления контейнера).

Также смотрите обоснование изменения (рендеринг допустимого html) в разделе http://msdn.microsoft.com/en-us/library/system.web.ui.control.renderingcompatibility.aspx.

Но окно списка предназначено для ввода пользователем, и атрибут disbled поддерживается в html, поэтому он должен отображать disabled="disabled".

Вы можете использовать немного jquery в качестве бандажа, пока это не будет исправлено должным образом. Если вы поместите это где-то, что выполняется для всех страниц, он исправит это для всех отключенных списков на всех страницах:

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

Вместо этого вы можете отключить параметры в поле выбора, так как это позволит выполнять прокрутку.

//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} 

К сожалению, из моих первоначальных исследований немного больно стилизовать отключенные входные элементы в хорошем кроссбраузерном стиле. Я решил использовать класс для своих целей, однако эта статья о стилизации отключенных элементов формы может помочь.

Вы можете также обратите внимание, что в IE по-прежнему будут запускаться события click, которые, казалось бы, отменяют выбор опций, но только в некоторых комбинациях пытаются использовать [disabled='disabled'][selected='selected'] или :checked:selected и т. д.

У меня была такая же проблема, но с CheckBoxList.

Установка его свойства Enabled в false не отключила его. Панель, внутри которой он находился, также не будет оказывать на него влияния, когда Enabled = false.

Решение состояло в том, чтобы использовать цикл foreach над элементами в списке CheckBoxList.

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