Résolution de la valeur « non définie » dans les listes déroulantes ASP.NET MVC jqGrid
Lors du remplissage dynamique des listes déroulantes jqGrid lors de l'édition des données, une valeur "non définie" indésirable apparaît fréquemment. Cela provient d'incohérences entre la structure de données attendue par jqGrid et la méthode de livraison des données.
Format de données jqGrid correct :
Le format idéal pour la valeur de la liste déroulante est : value: "FE:FedEx; IN:InTime; TN:TNT"
Problème avec la méthode actuelle :
L'approche actuelle utilise ASP.NET MVC avec $.ajax()
de jQuery pour récupérer les données déroulantes. Un StringBuilder
manipule les données récupérées pour correspondre au format de jqGrid, mais une entrée supplémentaire « non définie » persiste.
Résultats du débogage :
Le débogage de FireBug indique que les guillemets supplémentaires introduits par sb.ToString()
sont les coupables. jqGrid ajoute ses propres guillemets, conduisant à des guillemets doublés et au problème « non défini ».
Une solution supérieure : utiliser dataUrl
et buildSelect
Au lieu de manipuler directement la propriété value
, une solution plus robuste consiste à utiliser les propriétés dataUrl
et buildSelect
de jqGrid dans editoptions
ou searchoptions
. Ceux-ci permettent une récupération et un formatage de données personnalisés.
Exemple dataUrl
Action :
<code class="language-csharp">public JsonResult GetDestinationList() { List<string> allDestinations = GetAllDestinations(); return Json(allDestinations, JsonRequestBehavior.AllowGet); }</code>
Exemple buildSelect
Fonction :
<code class="language-javascript">buildSelect: function(data) { var s = ''; if (data && data.length) { for (var i = 0, l = data.length; i < l; i++) { s += data[i] + ';'; // Assuming data[i] is already in "key:value" format } return s.substring(0, s.length - 1); // Remove trailing semicolon } return s; }</code>
Mise à jour editoptions
:
<code class="language-javascript">{ name: 'destinations', editable: true, edittype: 'select', editoptions: { dataUrl: '/YourController/GetDestinationList', // Replace with your controller action path buildSelect: function(data) { // ... (buildSelect function from above) ... } } }</code>
Remarques importantes :
Json(allDestinations);
sans JsonRequestBehavior.AllowGet
, mais vous devrez ajouter ajaxSelectOptions: { type: "POST" }
à vos options jqGrid.buildSelect
est appelé dans le gestionnaire de succès $.ajax()
, ce qui rend jQuery.parseJSON(data.responseText)
inutile.Cette approche révisée fournit une méthode plus propre, plus efficace et moins sujette aux erreurs pour gérer les listes déroulantes jqGrid, éliminant ainsi le problème de valeur « non définie ». N'oubliez pas de remplacer /YourController/GetDestinationList
par le chemin réel vers l'action de votre contrôleur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!