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

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

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

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

4 ответа

Решение

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

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

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

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

public Class DynamicDropDownList : DropDownList
{
}

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

Еще один способ справиться с этим:

Установить свойство EnableViewState="False" на конкретный элемент.

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

Я обнаружил, что проще заменить элемент управления 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);
    } 
Другие вопросы по тегам