2009-05-14 11 views
0

Le code suivant remplit une deuxième liste déroulante lorsque la première liste déroulante est modifiée (c'est-à-dire, des listes déroulantes en cascade). Cependant, l'appel Ajax ne tire pas, et je ne peux pas comprendre pourquoi. Je ne reçois aucune erreur de syntaxe ou d'exécution. En mode débogage, l'action GetPlans n'est jamais appelée. L'alerte intérieure n'est jamais appelée, mais l'externe est. Pour aggraver les choses, cette même configuration fonctionne ailleurs dans mon application! Voici toutes les pièces pertinentes (permettez-moi de savoir si je l'ai laissé quelques détails importants):La requête Ajax ne se déclenche pas, car elle génère la mauvaise URL

"Rapport/auth" Voir:

<script type="text/javascript" src="../../Scripts/jquery-1.3.2.min.js"></script> 

<script type="text/javascript" src="../../Scripts/MicrosoftAjax.js"></script> 

<script type="text/javascript"> 

    $(function() { 
     $("#year").change(function() { 

      var year = $("#year > option:selected").attr("value"); 
      var rid = $("#rid").attr("value"); 

      $.ajax({ 
       type: "GET", 
       contentType: "application/json; charset=utf-8", 
       url: "GetPlans/" + rid + "/" + year, 
       data: "{}", 
       dataType: "json", 
       success: function(data) { 
        alert('inside'); 
        if (data.length > 0) { 
         var options = ''; 
         for (p in data) { 
          var plan = data[p]; 
          options += "<option>" + plan + "</option>"; 
         } 
         $("#plan").html(options); 

        } else { 
         $("#plan").html(''); 
        } 
       } 
      }); 

      alert("outer"); 
     }); 
    }); 

</script> 

<% Using Html.BeginForm()%> 
<%=Html.Hidden("rid")%> 
Year: 
<%=Html.DropDownList("year", Model.Years)%> 
Plan: 
<%=Html.DropDownList("plan")%> 
<% End Using%> 

ReportController:

Function Auth(ByVal rid As Integer) As ActionResult 

    ViewData("plan") = New SelectList(New List(Of SelectListItem)) 
    Return View(New Auth) 

End Function 

Public Function GetPlansByYear(ByVal rid As Integer, ByVal year As Integer) As JsonResult 

    Dim plans = _ 
     (From bp In BenefitDataContext.GetContext.BenefitPlans _ 
     Where bp.Benefit.repository_id = rid _ 
     And bp.Benefit.plan_year_val = year _ 
     Select bp.MphcPlan).Distinct 

    Return New JsonResult _ 
     With {.Data = _ 
       From p In plans _ 
       Select New SelectListItem _ 
        With {.Text = p.plan_code & " - " & p.plan_desc, _ 
          .Value = p.plan_id}} 

End Function 

classe Auth:

Public Class Auth 

    Private _years As SelectList 
    Public Property Years() As SelectList 
     Get 
      Return _years 
     End Get 
     Set(ByVal value As SelectList) 
      _years = value 
     End Set 
    End Property 

    Public Sub New() 

     Dim disinctYears = _ 
      (From b In BenefitDataContext.GetContext.Benefits _ 
      Where b.repository_id = 1 _ 
      Select b.plan_year_val).Distinct 

     Dim yearList = _ 
      From y In disinctYears _ 
      Order By y _ 
      Select New SelectListItem _ 
       With {.Text = y, _ 
         .Value = y, _ 
         .Selected = (y = Now.Year)} 

     Years = New SelectList(yearList, "Value", "Text") 

End Sub 

Global.asax - Inscription Routes:

routes.MapRoute(_ 
    "AuthReportGetPlans", _ 
    "GetPlans/{rid}/{year}", _ 
    New With {.controller = "Report", .action = "GetPlansByYear", .rid = "", .year = ""} _ 
) 

Des idées pour savoir ce qui se passe?

MISE À JOUR: trouvé le problème via l'inspection de la sortie d'erreur de l'appel Ajax, alors maintenant je sais que la cause du problème: l'URL est ajouté au chemin actuel au lieu d'être appelé de la route, à savoir/Reports/Auth/GetPlans/1/2009 au lieu de/GetPlans/1/2009. Ceci est déroutant car il semble qu'il soit correctement configuré dans global.asax pour mapper vers l'itinéraire que j'ai configuré, et comme indiqué précédemment, j'ai configuré ceci dans une autre vue et cela fonctionne bien. Toute entrée sur la raison pour laquelle l'appel Ajax spécifie le mauvais chemin?

Répondre

2

est-il pas frapper l'URL du tout? Peut-être que vous devriez faire votre URL absolue:

url: "/GetPlans/" + rid + "/" + year 

Essayez aussi lier l'action sur $ (document) .ready() au lieu immédiatement.

+0

Intéressant. Le rendre absolu (c'est-à-dire ajouter la barre oblique) semblait résoudre le problème. C'est intéressant parce que mon autre implémentation de ce code n'a pas eu la barre oblique et a bien fonctionné (celle-ci fonctionne aussi très bien avec la barre oblique, donc je l'ai laissé dans les deux endroits). – gfrizzle

+0

La barre oblique principale rend votre URL absolue. Je parie que vous étiez dans un sous-répertoire lorsque le code s'est arrêté. –

2

Essayez de capturer l'événement d'erreur de l'appel .ajax et voir si elle vous dit toute information supplémentaire

$.ajax({ 
    type: "GET", 
    contentType: "application/json; charset=utf-8", 
    url: "GetPlans/" + rid + "/" + year, 
    data: "{}", 
    dataType: "json", 
    success: function(data) { 
     alert('inside'); 
     if (data.length > 0) { 
      var options = ''; 
      for (p in data) { 
       var plan = data[p]; 
       options += "<option>" + plan + "</option>"; 
      } 
      $("#plan").html(options); 
     } else { 
      $("#plan").html(''); 
     } 
    }, 
    error: function(xhr){ 
     alert('something is b0rked') 
     // take a look at xhr.status and xhr.responseText 
    } 
}); 
+0

C'est exactement ce qui me manquait. L'appel bombardait mais ne me disait pas pourquoi. Maintenant, je sais que l'URL est ajoutée au chemin actuel (la question originale a été mise à jour avec des détails). Merci beaucoup - ce sera utile sur la route. – gfrizzle

0

Assurez-vous que MicrosoftAjax.js n'utilise pas le $ pour ses propres besoins.

Si elle est, vous pouvez trouver des informations sur la façon d'utiliser autre chose que le $ sur ce page

Par exemple:

var $jQuery = jQuery.noConflict(); 


$jQuery(function() { 
    $jQuery("#year").change(function() { 

     var year = $jQuery("#year > option:selected").attr("value"); 
     var rid = $jQuery("#rid").attr("value"); 

     $jQuery.ajax({ ... 

...

0

Question idiote. .. Etes-vous sûr que vos chemins de script sont corrects? Je devais faire du piratage afin de m'assurer que j'étais au bon endroit (voir this thread)

Je ne suis pas un énorme utilisateur de jQuery (je sais très peu et je suis donc dangereux), je serais tenté de m'assurer en collant

alert('Yep, I'm running'); 

quelque part dans votre fonction.

EDIT

Le fil que je montrai ne traite pas spécifiquement la question du chemin. Basicvally J'ai une méthode d'assistance appelée GetRootPath qui retourne la racine du site, et j'appelle les fichiers jQuery comme suit

<script src="<%= Html.GetBasePath() %>Scripts/jQuery.js" type="text/javascript"></script> 

Désolé pour la confusion

Et maintenant, je vais tenter d'enseigner ma grand-mère sucer des oeufs. ;)

Questions connexes