2009-05-14 2 views
0

Der folgende Code füllt ein zweites Dropdown-Menü, wenn sich das erste Dropdown-Menü ändert (d. H. Kaskadierende Dropdown-Menüs). Der Ajax-Aufruf wird jedoch nicht ausgelöst, und ich kann nicht herausfinden, warum. Ich bekomme keine Syntax- oder Laufzeitfehler. Im Debug-Modus wird die GetPlans-Aktion niemals aufgerufen. Die innere Warnung wird nie genannt, aber die äußere ist. Um das Ganze noch schlimmer zu machen, funktioniert das gleiche Setup anderswo in meiner App! Hier alle relevanten Stücke (lassen Sie mich wissen, wenn ich habe ein paar wichtige Details weggelassen):Ajax-Abfrage wird nicht ausgelöst, weil die falsche URL generiert wird

"Report/Auth" Ansicht:

<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 

Auth Klasse:

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 - Registrieren Routen:

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

Irgendwelche Ideen, wie man herausfinden kann, was los ist?

UPDATE: das Problem gefunden, die Fehlerausgabe des Ajax-Aufruf über die Kontrolle, so weiß ich jetzt, die Ursache des Problems: die URL an den Strompfad angehängt wird, anstatt von der Route genannt wird, dh/Berichte/Auth/GetPlans/1/2009 anstelle von/GetPlans/1/2009. Dies ist verwirrend, da es so aussieht, als ob es korrekt in global.asax eingerichtet wurde, um es der Route zuzuweisen, die ich eingerichtet habe, und wie bereits erwähnt, habe ich dies in einer anderen Ansicht eingerichtet und es funktioniert dort gut. Irgendeine Eingabe, warum der Ajax-Aufruf den falschen Pfad angibt?

Antwort

2

Ist erzählt? Vielleicht sollten Sie Ihre URL absolute machen:

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

auch versuchen, die Aktion auf $ (document) .ready() statt sofort verbindlich.

+0

Interessant. Wenn man es absolut machte (d. H. Den führenden Schrägstrich hinzufügte), schien das Problem zu beheben. Es ist interessant, weil meine andere Implementierung dieses Codes nicht den führenden Schrägstrich hatte und gut funktionierte (das funktioniert auch gut mit dem führenden Schrägstrich, also habe ich es an beiden Stellen gelassen). – gfrizzle

+0

Der führende Schrägstrich macht Ihre URL absolut. Ich wette, du warst in einem Unterverzeichnis, als der Code aufhörte. –

2

Versuchen Sie, die Fehlerereignis des .ajax Anruf zu erfassen und sehen, ob es Sie zusätzliche Informationen nicht die URL trifft auf alle

$.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

Genau das habe ich vermisst. Der Anruf war bombardierend, sagte mir aber nicht warum. Jetzt weiß ich, dass die URL an den aktuellen Pfad angehängt wird (ursprüngliche Frage wird mit Details aktualisiert). Vielen Dank - das wird sich als nützlich erweisen. – gfrizzle

0

Überprüfen Sie, ob MicrosoftAjax.js das $ nicht für eigene Zwecke verwendet.

Wenn ja, können Sie Informationen, wie Sie auf dieser etwas anderes als die $ verwenden page

Zum Beispiel:

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

Dumme Frage. .. Sind Sie sicher, dass Ihre Scriptpfade korrekt sind? Ich musste etwas hacken um sicherzustellen, dass ich an der richtigen Stelle war (siehe this thread)

Ich bin kein großer jQuery Benutzer (ich weiß sehr wenig und bin daher gefährlich), würde ich versucht sein, sicher zu stellen durch

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

irgendwo in Ihrer Funktion.

EDIT

Der Faden ich nicht speziell den Pfad Problem befasst sich gezeigt wird. Basicvally habe ich eine Hilfsmethode GetRootPath genannt, die die Wurzel der Website zurückkehrt, und ich rufe die Dateien jQuery wie für die Verwirrung

Und jetzt

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

Es folgt, versuche ich werde meine Großmutter zu lehren Eier saugen. ;)

Verwandte Themen