2010-05-12 71 views
2

问题:如何在回发后同时维护两个下拉列表中的内容(来自查询)和选定的值?AJAX CascadingDropDown ViewState问题

源代码:从这个link下载我的源代码(链接现在工作)。只需添加对您的AjaxControlToolkit的引用

用户操作:从每个下拉列表中选择一个值。点击提交。
回发后: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

刷新页面后,下拉列表是否会重新载入其值? – 2010-05-12 13:20:18

+0

你可以发布Default.aspx的代码隐藏文件吗? – 2010-05-12 14:01:21

回答

0

我放弃了CascadingDropDown,而是使用常规回传和UpdatePanel。

0

要主在回发中保留下拉列表的内容,确保在代码隐藏中加载控件的逻辑位于if语句中,以检查它是否是回发。例如...

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

保持来自控件的数据将由视图状态完成。

+0

这些控件是aspx代码的一部分。我不需要在page_load例程中加载任何东西。 – Steven 2010-05-12 18:25:32

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 2010-05-20 16:52:48

+0

**不起作用。**客户端代码(会重置子级下拉列表)在page_load之后甚至在page_unload之后调用。另外,在form_load(和unload)中,两个下拉列表只有1个Item,它们是每个的SelectedValue。 – Steven 2010-05-20 18:05:18

+0

我结束了使用: var value = Request [childControl.UniqueID]; – 2017-02-19 17:05:09