Отключить EventValidation для одного элемента управления, это возможно?
Я знаю, что это очень обсуждаемая тема, и обычно, когда вы думаете об этом как о решении, вы, возможно, захотите переосмыслить логику пользовательского интерфейса.
Я знаю, что могу пройти проверку с помощью ClientScriptManager.RegisterForEventValidation. Но я бы очень хотел знать. Можно ли удалить проверку события для одного элемента управления? Есть ли способ обойти это?
Я изменяю DropDownList со стороны клиента после его рендеринга.
4 ответа
Краткий ответ на ваш вопрос: нет, нет способа сделать это. Вы должны отключить EventValidation для всей страницы.
Существуют различные обходные пути... Если вы действительно не хотите отключать EventValidation, сохраните выбранное значение в скрытом поле и восстановите состояние DropDownList (или, может быть, просто очистите выбор?).
Если вам нужны все значения, добавленные на стороне клиента, вы все равно должны отправить их с использованием другого метода, потому что они не будут присутствовать в элементе управления на стороне сервера. Эти значения не опубликованы!
Атрибут SupportsEventValidation не наследуется для подклассов, поэтому, если вы создаете подкласс DropDownList, не применяете этот атрибут к подклассу и используете подкласс на своей странице, у вас будет элемент управления, который не запускает проверку события, даже если на странице включена проверка события.
public Class DynamicDropDownList : DropDownList
{
}
Еще один способ справиться с этим:
Установить свойство 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);
}