Ajax-запрос не запускается, потому что он генерирует неправильный URL - PullRequest
0 голосов
/ 15 мая 2009

Следующий код заполняет второй раскрывающийся список при изменении первого раскрывающегося списка (т.е. каскадные раскрывающиеся списки). Однако вызов Ajax не запускается, и я не могу понять, почему. Я не получаю никаких синтаксических ошибок или ошибок времени выполнения. В режиме отладки действие GetPlans никогда не вызывается. Внутреннее оповещение никогда не вызывается, а внешнее. Что еще хуже, эта же настройка работает в другом месте в моем приложении! Вот все соответствующие части (дайте мне знать, если я пропустил некоторые важные детали):

Просмотр отчета / аутентификации:

<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

Класс аутентификации:

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 - Регистрация маршрутов:

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

Любые идеи о том, как выяснить, что происходит?

ОБНОВЛЕНИЕ: Обнаружил проблему, проверив вывод ошибок Ajax-вызова, поэтому теперь я знаю причину проблемы: URL добавляется к текущему пути, а не вызывается из маршрута , т. е. / Reports / Auth / GetPlans / 1/2009 вместо / GetPlans / 1/2009. Это сбивает с толку, поскольку кажется, что он настроен правильно в global.asax для сопоставления с маршрутом, который я настроил, и, как уже говорилось ранее, я настроил это в другом представлении, и там он работает нормально. Любые входные данные о том, почему вызов Ajax указывает неправильный путь?

Ответы [ 4 ]

2 голосов
/ 15 мая 2009

Разве это не попадает в URL вообще? Может быть, вы должны сделать свой URL абсолютным:

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

Также попробуйте связать действие с $ (document) .ready () вместо немедленного.

2 голосов
/ 15 мая 2009

Попробуйте записать событие ошибки вызова .ajax и посмотрите, сообщит ли оно вам какую-либо дополнительную информацию

$.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 голосов
/ 15 мая 2009

Глупый вопрос ... Вы уверены, что ваши пути скриптов верны? Мне пришлось взломать, чтобы убедиться, что я нахожусь в нужном месте (см. эту тему )

Я не большой пользователь jQuery (я очень мало знаю и поэтому опасен), я бы соблазнился, если бы набрал

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

где-то в вашей функции.

EDIT

Поток, на который я указывал, конкретно не решает проблему пути. По сути, у меня есть вспомогательный метод GetRootPath, который возвращает корень сайта, и я вызываю файлы jQuery следующим образом

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

Извините за путаницу

А теперь я попытаюсь научить мою бабушку сосать яйца. ;)

0 голосов
/ 15 мая 2009

Убедитесь, что MicrosoftAjax.js не использует $ для своих собственных целей.

Если это так, вы можете найти информацию о том, как использовать что-то, кроме $, на этой странице

Например:

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({ ...

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...