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?
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
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é. –