Étapes de création d’une liste déroulante en cascade à l’aide de l’infrastructure Microsoft ASP.NET AJAX
Cet article explique comment créer une liste déroulante en cascade à l’aide de l’infrastructure AJAX ASP.NET.
Version du produit d’origine : .NET Framework 3.5
Numéro de la base de connaissances d’origine : 976156
Introduction
Remarque
Le .NET Framework 3.5 doit être installé pour utiliser les fonctionnalités ASP.NET AJAX. Si vous souhaitez incorporer ASP.NET fonctionnalités AJAX dans .NET Framework 2.0, vous devez avoir ASP.NET 2.0 AJAX Extensions 1.0 installée.
Une liste déroulante en cascade est une série de contrôles dépendants DropDownList
dans lesquels un DropDownList
contrôle dépend du parent ou des contrôles précédents DropDownList
. Les éléments du DropDownList
contrôle sont remplis en fonction d’un élément sélectionné par l’utilisateur à partir d’un autre DropDownList
contrôle. Lorsque la sélection d’un contrôle parent DropDownList
change, la page web appelle le service Web AJAX pour récupérer la liste des valeurs du contrôle enfant DropDownList
. L’infrastructure AJAX ASP.NET vous permet d’appeler des services web (fichiers .asmx) à partir du navigateur à l’aide de scripts clients. Par conséquent, lorsque vous appelez le service Web dans l’événement côté onchange
client du contrôle parent DropDownList
, la page Web n’est que partiellement actualisée pour remplir les éléments du contrôle enfant DropDownList
.
Remarque
Le ASP.NET AJAX Control Toolkit fournit un CascadingDropDown
contrôle en tant qu’extendeur ASP.NET AJAX. Vous pouvez utiliser le CascadingDropDown
contrôle pour créer une liste déroulante en cascade. Cet article explique comment utiliser le contrôle standard DropDownList
dans ASP.NET avec l’infrastructure AJAX ASP.NET pour obtenir la fonction de liste déroulante en cascade.
Étapes de création d’une liste déroulante en cascade
Créez une application de service web ASP.NET dans Visual Studio.
Remarque
Dans l’exemple de code fourni, le nom de projet de l’exemple de projet C# est KB_CascadingDDL_CS. Le nom de projet de l’exemple de projet .NET Visual Basic est KB_CascadingDDL_VB.
Ajoutez un formulaire web AJAX au projet.
Remarque
Dans l’exemple de code, le nom de fichier du formulaire Web est Default.aspx. Le nom du service Web AJAX est WebService.
Ouvrez le fichier WebServiceName.asmx pour le service Web AJAX, puis supprimez la marque de commentaire pour la déclaration de classe comme suit.
Visual Basic
<System.Web.Script.Services.ScriptService()> Public Class WebService
Visual C#
[System.Web.Script.Services.ScriptService] public class WebService : System.Web.Services.WebService
Remarque
Cette étape permet d’accéder au service web AJAX à partir des scripts côté client. L’attribut doit être appliqué à une
ScriptServiceAttribute
classe de service Web AJAX, et l’attribut doitWebMethodAttribute
être appliqué aux méthodes individuelles qui seront appelées à partir de scripts côté client.Ouvrez le fichier WebFormName.aspx du formulaire Web, puis modifiez la <balise asp :ScriptManager> comme suit :
<asp:ScriptManager ID="ScriptManager1" runat="server"> <Services> <asp:ServiceReference Path="~/WebServiceName.asmx" /> </Services> </asp:ScriptManager>
Pour permettre à un service Web AJAX d’être appelé à partir des scripts côté client dans un formulaire web ASP.NET, vous devez d’abord ajouter un
ScriptManager
contrôle à la page Web. Ensuite, référencez le service Web en ajoutant un<asp:ServiceReference>
élément enfant à la<asp:ScriptManager>
balise. Dans la<asp:ScriptManager>
balise , définissez l’attributPath
pour qu’il pointe vers le fichier de service Web.L’objet
ServiceReference
indique ASP.NET extensions AJAX 2.0 de générer une classe proxy JavaScript pour appeler le service Web spécifié à partir des scripts côté client dans la page Web. La classe proxy a des méthodes qui correspondent à chaque méthode de service Web dans le service Web AJAX. La page Web contient également des classes proxy JavaScript qui correspondent aux types de données serveur utilisés comme paramètres d’entrée ou valeurs de retour pour les méthodes de service web. Ces classes proxy vous permettent d’écrire des scripts côté client qui initialisent ces paramètres et les passent à l’appel de méthode du service web.Définissez la
EnableEventValidation
propriété de la page Web sur false dans le code source du fichier WebFormName.aspx , comme illustré dans l’exemple suivant.<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="KB_CascadingDDL_VB._Default" EnableEventValidation="false" %>
Remarque
Cette étape permet d’éviter une publication non valide lorsque vous utilisez des appels de méthode de service web.
Ajoutez le code suivant sous la <balise asp :ScriptManager> pour générer les contrôles ASP.NET requis.
<table> <tr> <td> Make: </td> <td> <asp:DropDownList ID="ddlMake" Width="200" runat="server" AutoPostBack="false" onchange="ddl_changed(this)" /> </td> </tr> <tr> <td> Model: </td> <td> <asp:DropDownList ID="ddlModel" Width="200" runat="server" AutoPostBack="false" onchange="ddl_changed(this)" /> </td> </tr> <tr> <td> Color: </td> <td> <asp:DropDownList ID="ddlColor" Width="200" runat="server" AutoPostBack="false" onchange="DisplayResult()" /> </td> </tr> <tr> <td> <asp:Button ID="btnReset" runat="server" Text="Reset" /> </td> </tr> </table> <a id="aResult" />
Créez des méthodes de service web pour le service Web AJAX. Copiez et collez le code suivant dans le fichier WebServiceName.asmx .
Visual Basic
Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.ComponentModel ' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. <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 WebService Inherits System.Web.Services.WebService <WebMethod()> _ Public Function GetMakeValue() As String() Return New String() {"Please select", "Ford", "Dodge"} End Function <WebMethod()> _ Public Function GetChildValue(ByVal parentID As String, ByVal parentValue As String) As String() If parentValue = "Please select" Then Return Nothing End If Dim values As String() If parentID = "ddlMake" Then If parentValue = "Ford" Then values = New String() {"Please select", "Explorer", "F150", "Mustang"} ElseIf parentValue = "Dodge" Then values = New String() {"Please select", "Durango", "Dakota", "Viper"} Else Return New String() {"Invalid Make value!"} End If ElseIf parentID = "ddlModel" Then Select Case parentValue Case "Explorer", "Dakota", "Viper" values = New String() {"Please select", "Black", "Green", "Yellow"} Case "Durango", "F150", "Mustang" values = New String() {"Please select", "White", "Red", "Blue"} Case Else values = New String() {"Invalid Model value!"} End Select Else Return New String() {"Invalid Category value!"} End If Return values End Function End Class
Visual C#
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace KB_CascadingDDL_CS { /// <summary> /// Summary description for WebService /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. [System.Web.Script.Services.ScriptService] public class WebService : System.Web.Services.WebService { [WebMethod()] public string[] GetMakeValue() { return new string[] { "Please select", "Ford", "Dodge" }; } [WebMethod()] public string[] GetChildValue(string parentID, string parentValue) { if (parentValue == "Please select") { return null; } string[] values; if (parentID == "ddlMake") { if (parentValue == "Ford") { values = new string[] { "Please select", "Explorer", "F150", "Mustang" }; } else if (parentValue == "Dodge") { values = new string[] { "Please select", "Durango", "Dakota", "Viper" }; } else { return new string[] { "Invalid Make value!" }; } } else if (parentID == "ddlModel") { switch (parentValue) { case "Explorer": case "Dakota": case "Viper": values = new string[] { "Please select", "Black", "Green", "Yellow" }; break; case "Durango": case "F150": case "Mustang": values = new string[] { "Please select", "White", "Red", "Blue" }; break; default: values = new string[] { "Invalid Model value!" }; break; } } else { return new string[] { "Invalid Category value!" }; } return values; } } }
Appelez les méthodes du service web pour le service web AJAX à partir de scripts côté client. Copiez et collez le code suivant sous le code que vous avez ajouté à l’étape 6.
<script type="text/javascript"> function pageLoad() { // call a Web service method with no parameters and the user context. KB_CascadingDDL_VB.WebService.GetMakeValue(SucceededCallbackWithContext, FailedCallback, "fillMake"); } // Event handler for ddlMake and ddlModel. // This function calls a Web service method // passing simple type parameters and the user context. function ddl_changed(sender) { // This initiates the call to the server-side method in your code-behind // The parameters are as follows: // 1st : Specify all the parameters expected by your code-behind method // (in this case there are 2: parentControl's ID, parentControl's selected text) // 2nd : Specify a callback method when the call succeeds // 3rd : Specify a callback method when the call fails(optional) // 4th : Specify a user context object (option - not shown) // (in this case we need to assign the parentControl's ID as the user context) KB_CascadingDDL_VB.WebService.GetChildValue(sender.id, sender[sender.selectedIndex].text, SucceededCallbackWithContext, FailedCallback, sender.id); } // This is the callback function called if the // Web service succeeded. It accepts the result // object, the user context, and the method name as // parameters. function SucceededCallbackWithContext(result, userContext) { if (userContext == "fillMake") { //fill the Make var ddl = $get('ddlMake'); } else if (userContext == "ddlMake") { // fill the Model var ddl = $get('ddlModel'); $get('ddlColor').options.length = 0; } else if (userContext == "ddlModel") { // fill the Color var ddl = $get('ddlColor'); } // clear the options ddl.options.length = 0; if (result) { var i = 0; for (var item in result) { // item is the key, result[item] is the value ddl.options.add(new Option(result[item], item)); i++; } } else { alert("Invalid! Please reset the selection!"); $get(userContext).focus(); } } // This is the callback function called if the // Web service failed. It accepts the error object // as a parameter. function FailedCallback(error) { if (error) { alert(error.get_message()); } else alert("An unexpeceted error occurred"); } //This the function to show the three DropDownLists'selection function DisplayResult() { $get("aResult").innerHTML = "You have selected a " + $get("ddlMake")[$get("ddlMake").selectedIndex].text + "," + $get("ddlModel")[$get("ddlModel").selectedIndex].text + "," + $get("ddlColor")[$get("ddlColor").selectedIndex].text + " car!"; } </script>
L’appel d’une méthode de service Web à partir d’un script est asynchrone. Pour obtenir une valeur de retour ou déterminer quand la demande a été retournée, vous devez fournir une fonction de rappel réussie. La fonction de rappel est appelée une fois la requête terminée, et elle contient la valeur de retour de l’appel de méthode de service web. Vous pouvez également fournir une fonction de rappel ayant échoué pour gérer les erreurs. En outre, vous pouvez transmettre des informations de contexte utilisateur à utiliser dans les fonctions de rappel.
Vous pouvez appeler une méthode de service web dans un service Web AJAX au format suivant :
theServiceNameSpace.WebServiceName.ServiceMethodName(parameters, SucceededCallbackFunctionName, FailedCallbackFunctionName, userContextString);
Vous pouvez fournir une seule fonction de rappel réussie appelée à partir de plusieurs appels de méthode de service Web. Pour permettre à la fonction de différencier différents appelants, vous pouvez transmettre les informations de contexte utilisateur à la fonction dans le paramètre .
Créez le projet.
References
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour