When debugging, the actual error states:
Unable to cast object of type ‘System.Object[]’ to type ‘AjaxControlToolkit.CascadingDropDownNameValue[]’.
After doing much research on this issue, it appears everyone’s resolution was to ensure that you included the ‘<WebMethod(), System.Web.Script.Services.ScriptMethod()> _’ above the public shared function that builds the ‘states’ for the first dropdown list (The sample in the Wrox book already has this in the code)… among other things that just didn’t do the trick.
I noticed there were many people who still complained that they tried everything suggested but to no avail.
After trial and error, I got mine working by simply altering the logic in the Function:
Instead of:
Public Shared Function GetStates(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
Return New Object() {New CascadingDropDownNameValue("Missouri", "Missouri"), New CascadingDropDownNameValue("Oregon", "Oregon")}
End Function
do this instead:
Public Shared Function GetStates(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
GetStates = Nothing
GetStates = {New CascadingDropDownNameValue("Missouri", "Missouri"), New CascadingDropDownNameValue("Oregon", "Oregon")}
Return GetStates
End Function
In other words, instead of ‘Return a New Object()….’, use the Function name of GetStates instead and then ‘Return GetStates’. This solves the casting problem and the Method Error 500.
Do the same for the GetCounties function.
Here is the full code from the book.
Before:
<%@ Import Namespace="System.Web.Services" %>
<%@ Import Namespace="AjaxControlToolkit" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<script runat="server" language="vb">
<WebMethod(), System.Web.Script.Services.ScriptMethod()> _
Public Shared Function GetStates(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
Return New Object() {New CascadingDropDownNameValue("Missouri", "Missouri"), New CascadingDropDownNameValue("Oregon", "Oregon")}
End Function
<WebMethod(), System.Web.Script.Services.ScriptMethod()> _
Public Shared Function GetCounties(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
If knownCategoryValues.Contains("Missouri") Then
Return New Object() {New CascadingDropDownNameValue("St. Charles", "St. Charles"), New CascadingDropDownNameValue("St. Louis", "St. Louis"), New CascadingDropDownNameValue("Jefferson", "Jefferson"), New CascadingDropDownNameValue("Warren", "Warren"), New CascadingDropDownNameValue("Franklin", "Franklin")}
End If
If knownCategoryValues.Contains("Oregon") Then
Return New Object() {New CascadingDropDownNameValue("Baker", "Baker"), New CascadingDropDownNameValue("Benton", "Benton"), New CascadingDropDownNameValue("Clackamas", "Clackamas"), New CascadingDropDownNameValue("Clatsop", "Clatsop"), New CascadingDropDownNameValue("Columbia", "Columbia")}
End If
Return Nothing
End Function
</script>
<title>CascadingDropDown</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ToolkitScriptManager runat="server" ID="scriptManager" />
<div>
<asp:DropDownList runat="server" ID="ddl1" Width="200" />
<br />
<asp:DropDownList runat="server" ID="ddl2" Width="200" />
<br />
<asp:CascadingDropDown runat="server" ID="cdd1" TargetControlID="ddl1" PromptText="Select a State"
Category="state" LoadingText="[Loading States]" ServiceMethod="GetStates" />
<asp:CascadingDropDown runat="server" ID="cdd2" TargetControlID="ddl2" ParentControlID="ddl1"
PromptText="Select County" Category="county" LoadingText="[Loading Counties]"
ServiceMethod="GetCounties" />
</div>
</form>
</body>
</html>
After:
<%@ Import Namespace="System.Web.Services" %>
<%@ Import Namespace="AjaxControlToolkit" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<script runat="server" language="vb">
<WebMethod(), System.Web.Script.Services.ScriptMethod()> _
Public Shared Function GetStates(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
GetStates = Nothing
GetStates = {New CascadingDropDownNameValue("Missouri", "Missouri"), New CascadingDropDownNameValue("Oregon", "Oregon")}
Return GetStates
End Function
<WebMethod(), System.Web.Script.Services.ScriptMethod()> _
Public Shared Function GetCounties(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
GetCounties = Nothing
If knownCategoryValues.Contains("Missouri") Then
GetCounties = {New CascadingDropDownNameValue("St. Charles", "St. Charles"), New CascadingDropDownNameValue("St. Louis", "St. Louis"), New CascadingDropDownNameValue("Jefferson", "Jefferson"), New CascadingDropDownNameValue("Warren", "Warren"), New CascadingDropDownNameValue("Franklin", "Franklin")}
End If
If knownCategoryValues.Contains("Oregon") Then
GetCounties = {New CascadingDropDownNameValue("Baker", "Baker"), New CascadingDropDownNameValue("Benton", "Benton"), New CascadingDropDownNameValue("Clackamas", "Clackamas"), New CascadingDropDownNameValue("Clatsop", "Clatsop"), New CascadingDropDownNameValue("Columbia", "Columbia")}
End If
Return GetCounties
End Function
</script>
<title>CascadingDropDown</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ToolkitScriptManager runat="server" ID="scriptManager" />
<div>
<asp:DropDownList runat="server" ID="ddl1" Width="200" />
<br />
<asp:DropDownList runat="server" ID="ddl2" Width="200" />
<br />
<asp:CascadingDropDown runat="server" ID="cdd1" TargetControlID="ddl1" PromptText="Select a State"
Category="state" LoadingText="[Loading States]" ServiceMethod="GetStates" />
<asp:CascadingDropDown runat="server" ID="cdd2" TargetControlID="ddl2" ParentControlID="ddl1"
PromptText="Select County" Category="county" LoadingText="[Loading Counties]"
ServiceMethod="GetCounties" />
</div>
</form>
</body>
</html>