【问题标题】:AJAX CascadingDropDown ViewState ProblemAJAX CascadingDropDown ViewState 问题
【发布时间】:2010-05-12 13:05:55
【问题描述】:

问题:如何在回发后维护两个下拉菜单的内容(来自查询)和选定值?

源代码:从此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

【问题讨论】:

  • 刷新页面时,下拉菜单是否会重新加载它们的值?
  • 你能发布 Default.aspx 的代码隐藏文件吗?

标签: c# .net vb.net ajax cascadingdropdown


【解决方案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];
}

希望这会有所帮助。

【讨论】:

  • 请提供我的源代码的修改版本。如果可行,我会接受。
  • 不起作用。 在 page_load 甚至在 page_unload 之后调用客户端代码(重置子下拉菜单)。此外,在 form_load(和卸载)中,两个下拉菜单都只有 1 个项目,即每个项目的 SelectedValue。
  • 我最终使用了:var value = Request[childControl.UniqueID];
【解决方案2】:

要在回发中维护下拉列表的内容,请确保在代码隐藏中加载控件的逻辑位于 if 语句中,以检查它是否为回发。比如……

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

从控件中保存数据将由视图状态完成。

【讨论】:

  • 控件是 aspx 代码的一部分。我不需要在 page_load 例程中加载任何内容。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2010-12-13
    相关资源
    最近更新 更多