ASP.Net CascadingDropDown и EnableEventValidation="ложь"
Я только что получил CascadingDropDown от AJAX Toolkit, работающего с SelectedIndexChanged, чтобы перенаправить на страницу, передающую строку запроса выбранного значения. Я в хорошем настроении!
Тем не менее, я только получил событие SelectedIndexChanged, добавив EnableEventValidation="false" на страницу. Проблема в том, что CascadingDropDown будет размещен на главной странице моего сайта в качестве селектора продукта.
Я не заинтересован в добавлении EnableEventValidation="false" в мою мастер-страницу! Я посмотрел на метод ClientScriptManager.RegisterForEventValidation на MSDN, и он ушел прямо у меня над головой.
Что лучше всего сделать? Есть ли простой пример использования ClientScriptManager.RegisterForEventValidation?
Приветствия...
РЕДАКТИРОВАТЬ: Вот код:
<asp:ScriptManager ID="asm" runat="server" />
<div>
Series: <asp:DropDownList ID="SeriesList" runat="server" /><br />
Printers: <asp:DropDownList ID="PrinterList" runat="server"
onselectedindexchanged="PrinterList_SelectedIndexChanged"
AutoPostBack="True" /><br />
</div>
<asp:CascadingDropDown ID="ccd1" runat="server"
ServicePath="CascadingDropdown1.cs.asmx" ServiceMethod="GetSeries"
TargetControlID="SeriesList" Category="Series"
PromptText="Select Series" />
<asp:CascadingDropDown ID="ccd2" runat="server"
ServicePath="CascadingDropdown1.cs.asmx" ServiceMethod="GetPrintersForSeries"
TargetControlID="PrinterList" ParentControlID="SeriesList" Category="Printer"
PromptText="Select Printer" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="PrinterList" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
А вот и событие:
protected void PrinterList_SelectedIndexChanged(object sender, EventArgs e)
{
int printerID = Convert.ToInt32(PrinterList.SelectedValue);
System.Web.HttpContext.Current.Response.Redirect("Default.aspx?PID="+printerID);
}
1 ответ
Ответ на эту боль в проблеме шеи - пользовательские выпадающие элементы управления!
Поэтому, чтобы закрыть этот вопрос и, надеюсь, помочь кому-то еще обойти эту проблему, вот что я сделал:
Я создал файл CS с именем NoValidationDropDownList.cs со следующим кодом
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
namespace My.Namespace.Controls
{
public class DdlNoEventValidation : DropDownList
{
}
}
Затем на странице aspx, где находятся раскрывающиеся элементы управления (в моем случае MasterPage), я разместил это:
<%@ Register TagPrefix="asp" Namespace="My.Namespace.Controls" %>
Затем я исправил выпадающие окна каскада следующим образом:
<p><asp:DdlNoEventValidation ID="DD1" runat="server" /></p>
<p><asp:DdlNoEventValidation ID="DD2" runat="server"
onselectedindexchanged="My_SelectedIndexChanged"
AutoPostBack="True"
/></p>
Насколько я понимаю, создание собственного выпадающего элемента управления обходит проверку событий. Таким образом, вам не нужно отключать проверку событий для всей страницы. В моем случае, поскольку элементы управления находятся в MasterPage, проверка событий была бы отключена для всего сайта!
Увы, это не моя оригинальная работа, поэтому вот оригинальная ссылка: http://johanleino.wordpress.com/2009/11/17/cascadingdropdown-casues-invalid-postback-or-callback-argument-error/
Спасибо, Йохан!
Надеюсь это поможет...