Отключить EventValidation для одного элемента управления, возможно ли это?

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

Я знаю, что могу пройти проверку с помощью ClientScriptManager.RegisterForEventValidation. Но мне бы очень хотелось узнать. Можно ли удалить проверку событий для одного элемента управления? Есть ли способ работать для этого?

Я изменяю DropDownList, с клиентской стороны после его рендеринга.

Ответ 1

Короткий ответ на ваш вопрос: Нет, нет способа сделать это. Вы должны отключить EventValidation для всей страницы.

Существуют различные способы обхода... Если вы действительно не хотите отключать EventValidation, сохраните выбранное значение в скрытом поле и восстановите состояние DropDownList (или, возможно, просто очистите выделение?).

Если вам нужны все добавленные значения на стороне клиента, вы все равно должны отправить их с помощью какого-либо другого метода, потому что они не будут присутствовать в контроле на стороне сервера. Эти значения не публикуются!

Ответ 2

Атрибут SupportsEventValidation не наследуется для подклассов, поэтому, если вы создаете подкласс DropDownList, не применяйте этот атрибут к подклассу и используйте подкласс на своей странице, у вас будет элемент управления, который не вызывает событие валидация, даже если на странице включена проверка событий.

public Class DynamicDropDownList : DropDownList
{
}

http://msdn.microsoft.com/en-us/library/system.web.ui.supportseventvalidationattribute%28v=VS.110%29.aspx

Ответ 3

Другой способ справиться с этим:

Задайте свойство EnableViewState="False" для конкретного элемента.

Рассуждение: если вы используете JavaScript для изменения этого значения вне элемента управления ASP.NET, то ViewState просто мешает вам в этот момент. Прекратите использовать его для этого элемента управления.

Ответ 4

Мне было проще заменить элемент управления эквивалентом HTML с помощью runat = "server", тогда вы можете получить значение старого способа с помощью Request.Forms [ "id" ]. Проверка не будет выполнена, поэтому будьте осторожны при хранении или обработке данных.

Другой вариант - переопределить Render на странице и использовать параметр Page.ClientScript.RegisterForEventValidation со всеми возможными ответами (не приятно).  что-то вроде этого

    protected override void Render(HtmlTextWriter writer)
    {
        this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "a");
        this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "b");
        this.Page.ClientScript.RegisterForEventValidation(ddlRisk.ID, "c");
        base.Render(writer);
    }