2010-05-12 3 views
2

Вопрос: Как сохранить как содержимое (из запросов), так и выбранное значение обоих выпадающих списков после обратной передачи?AJAX CascadingDropDown ViewState Problem

Исходный код: Скачать мой исходный код этой link (ссылка теперь работает). Просто добавьте ссылку на свой AjaxControlToolkit

Действия пользователя: Выберите значение из раскрывающегося списка. Нажмите «Отправить».
После Postback:StatesDrop: (Выбранное значение), CitiesDrop «Выберите город»

До и после:

alt text http://www.aphio.org.vt.edu/test/beforeandafter.GIF

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

C# ответы также приветствуются.

Default.aspx

Active States<br /><asp:DropDownList ID="StatesDrop" runat="server" /><br /> 
Active Cities<br /><asp:DropDownList ID="CitiesDrop" runat="server" /><br /> 

<ajax:CascadingDropDown ID="StatesCasc" TargetControlID="StatesDrop" 
     ServicePath="WebService1.asmx" ServiceMethod="GetActiveStates" 
     Category="States" runat="server" 
     PromptText="Select a State" PromptValue="?" /> 

<ajax:CascadingDropDown ID="CitiesCasc" TargetControlID="CitiesDrop" 
     ServicePath="WebService1.asmx" ServiceMethod="GetActiveCities" 
     Category="Cities" runat="server" ParentControlID="StatesDrop" 
     PromptText="Select a City" PromptValue="?" /> 

WebService1.asmx.vb

Imports System.Web.Services 
Imports System.Web.Services.Protocols 
Imports System.ComponentModel 
Imports System.Web.Script.Services 
Imports AjaxControlToolkit 
<System.Web.Script.Services.ScriptService()> _ 
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _ 
<System.Web.Services.WebServiceBinding _ 
    (ConformsTo:=WsiProfiles.BasicProfile1_1)> _ 
<ToolboxItem(False)> _ 
Public Class WebService1: Inherits System.Web.Services.WebService 

    <WebMethod()> _ 
    Public Function GetActiveStates (ByVal knownCategoryValues As String, _ 
     ByVal category As String) As CascadingDropDownNameValue() 
     Dim values As New List(Of CascadingDropDownNameValue)() 
     'Fill values array' 
     Return values.ToArray() 
    End Function 

    <WebMethod()> _ 
    Public Function GetActiveCities (ByVal knownCategoryValues As String, _ 
     ByVal category As String) As CascadingDropDownNameValue() 
     Dim values As New List(Of CascadingDropDownNameValue)() 
     Dim kv As StringDictionary = _ 
     CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues) 
     Dim SelState As String = "" 
     If kv.ContainsKey("State") Then SelState = kv("State") 
     'Fill values array' 
     Return values.ToArray() 
    End Function 
End Class 

Default.aspx.vb

Imports System.Web.Services 
Imports System.Web.Script.Services 
Imports AjaxControlToolkit 

Partial Public Class _Default 
    Inherits System.Web.UI.Page 

    Protected Sub Submit_Click(ByVal sender As Object, _ 
           ByVal e As EventArgs) Handles SubmitBtn.Click 
     ResultsGrid.DataBind() 
    End Sub 
End Class 
+0

Когда страница обновляется, выпадающие меню перезагружают их значения? –

+0

Можете ли вы опубликовать файл codebehind Default.aspx? –

ответ

0

Я отказался от CascadingDropDown и вместо этого использовал обычные postbacks и UpdatePanel.

0

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

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      //Load Controls 
     } 
    } 

Сохранение данных с элементов управления осуществляется с помощью viewstate.

+0

Элементы управления являются частью кода aspx. Мне не нужно загружать что-либо в процедуру page_load. – Steven

1

Поскольку элементы зависимого выпадающего списка заполняются на стороне клиента. Сервер не знает об этом. Вы должны заполнить элементы зависимого выпадающего списка на каждом столбце. Поэтому напишите следующий код в своем page_load.

if(!IsPostBack) { 
//Some logic 
} 
else { 
    //populate child drop down list on the base of selected value of parent drop down. 
// you can set the selected value of child control by getting the selected value from Request //object for example write following code to set the value of child control 

childControl.SelectedValue = Request[childControl.UniqueID]; 
} 

надеюсь, что это поможет.

+0

Пожалуйста, предоставьте модифицированную версию моего исходного кода. Если это сработает, я соглашусь. – Steven

+0

** Не работает. ** Код клиента (который сбрасывает раскрывающийся список) вызывается после page_load и даже после page_unload. Кроме того, в form_load (и выгрузка) в обоих выпадающих списках есть только 1 элемент, который является 'SelectedValue' каждого. – Steven

+0

Я закончил использование: var value = Request [childControl.UniqueID]; –

Смежные вопросы