MVC: получить URL-адрес метода при использовании маршрутизации

Я нашел это руководство о том, как создавать каскадные раскрывающиеся списки в MVC с синтаксисом Razor. Я следовал руководству и отлично работал в своем собственном проекте. Но теперь, когда я пытаюсь перенести его в свой настоящий проект, я получаю сообщение об ошибке при изменении первого раскрывающегося списка. В соответствии со сценарием появляется предупреждение, в котором говорится:

Failed to retrieve states: [object Object]

Я понятия не имею, что означает [object Object]. Я предполагаю, что ошибка как-то связана с URL:

url: '@Url.Action("GetStates")

Но это всего лишь предположение. Основное различие между проектом-примером и реальным проектом заключается в том, что реальный проект использует маршрутизацию для URL-адреса. Вот весь скрипт:

<script src="~/Scripts/jquery-1.10.2.js" type="text/javascript"></script>
<script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"</script>
<script type="text/javascript">
$(document).ready(function () {
    //Dropdownlist Selectedchange event
    $("#Country").change(function () {
        $("#State").empty();
        $.ajax({
            type: 'POST',
            url: '@Url.Action("GetStates")', // we are calling json method

            dataType: 'json',

            data: { id: $("#Country").val() },
           // here we are get value of selected country and passing same value as input to json method GetStates.

            success: function (states) {
                // states contains the JSON formatted list
                // of states passed from the controller

                $.each(states, function (i, state) {
                $("#State").append('<option value="' + state.Value + '">' +
                     state.Text + '</option>');
                // here we are adding option for States

                });
            },
            error: function (ex) {
                alert('Failed to retrieve states: ' + ex);
            }
        });
        return false;
    })
});

EDIT AFTER:

Наблюдая за сетевым трафиком в инструментах разработчика Chrome, я сделал это в автономном проекте, который работает, и увидел эту запись с заголовком «GetStates» и этот URL-адрес: http://localhost:50266/CustomerFeedback./GetStates.

Я сделал это снова в своем реальном проекте, и на этот раз я вижу запись с надписью «45/» с этим URL-адресом: http://localhost:65303/PatientSatisfactionSurvey/45/.

Я думаю, это подтверждает мое подозрение, что проблема в URL-адресе. Мне придется поиграть с выяснением того, как сделать этот URL действительным.

Еще одно изменение:

В проекте, который работает, если я перейду к: http://localhost:50266/CustomerFeedback/GetStates

Я получаю это:

Server Error in '/' Application.

This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.

Это ожидается, поскольку я пытаюсь использовать этот фактический метод. Это означает, что я могу перейти по URL-адресу метода. Но когда я пытаюсь сделать то же самое в своем проекте: http://localhost:65303/PatientSatisfactionSurvey/GetStates он просто загружает страницу. Это потому, что он считает, что «GetStates» — это параметр, а не метод.

Я НЕ МОГУ понять, каким будет URL-адрес метода! Чертова маршрутизация мешает....

        routes.MapRoute(
            "PatientSatisfactionSurvey",
            "PatientSatisfactionSurvey/{ApptID}/{*LanguageCode}",
            new { controller = "Forms", action = "PatientSatisfactionSurvey" },
            namespaces: new[] { "GEDC.Controllers" }
        );

person Casey Crookston    schedule 03.06.2015    source источник
comment
Вы смотрели, что находится внутри объекта ex, используя отладчик или console.dir() или что-то в этом роде?   -  person Brad C    schedule 03.06.2015
comment
Я хотел бы знать, как это сделать! Это javascript, поэтому он не столкнется со стандартной точкой останова. Я слишком хорошо знаком с MVC и jquery, чтобы знать, как это отлаживать или что означает console.dir(). Я начну искать, но если у вас есть какие-либо быстрые указатели, я был бы признателен.   -  person Casey Crookston    schedule 03.06.2015
comment
Если вы откроете инструменты разработки вашего веб-браузера и перейдете в раздел «Сеть» и запустите код, вы увидите, что фактический запрос отправляется на сервер. Посмотрите на ответ там, и он должен сказать вам, почему он терпит неудачу.   -  person Brad C    schedule 03.06.2015
comment
см. мое редактирование вопроса. И СПАСИБО за помощь!   -  person Casey Crookston    schedule 03.06.2015
comment
Кроме того, к большинству инструментов разработчика браузеров можно получить доступ с помощью <F12>.   -  person War10ck    schedule 03.06.2015


Ответы (2)


Попробуйте изменить @Url.Action("GetStates") на:

@Url.Action("ControllerName", "ActionName")

Вероятно, что-то вроде @Url.Action("PatientSatisfactionSurvey", "GetStates"), который будет генерировать URL-адрес, например ~/PatientSatisfactionSurvey/GetStates/5, где 5 — это идентификатор, который он получает из элемента html с идентификатором страны.

person Brad C    schedule 03.06.2015
comment
brd4, я ОЧЕНЬ ценю вашу помощь. К сожалению, я получаю те же результаты. Я узнал несколько вещей. Собираюсь обновить исходный вопрос. Обновить через 5. - person Casey Crookston; 03.06.2015

Наконец-то это получилось. Моя проблема была тройной. Во-первых, когда я посмотрел исходник HTML, оказалось, что это:

url: '@Url.Action("GetStates")', // we are calling json method

рендерил так:

url: ''

Как только я убрал синтаксис бритвы, он, по крайней мере, правильно отобразился в HTML. Однако он по-прежнему получал неверный URL. Поскольку карта маршрутов, которую я использовал, содержала параметры, в итоге я просто создал совершенно новую карту маршрутов для этого метода:

        routes.MapRoute(
            "GetStates",
            "GetStates",
            new { controller = "Forms", action = "GetStates" },
            namespaces: new[] { "xyz.Controllers" }
        );

Затем я изменил строку URL в javascript, чтобы она выглядела так:

url: 'GetStates'

Но проблема заключалась в том, что он просто добавлял /GetStates в конец любого URL-адреса, на котором я находился. Если поместить туда полный полный URL-адрес, вот так...

url: 'http://localhost:65303/GetStates'

Это сработало. Но по понятным причинам этот URL не является долгосрочным решением. Итак, используя этот поток, я наконец нашел отвечать. Мне удалось получить полный URL-адрес этого метода GetStates() следующим образом:

// Get the fully qualifed URL of the FollowUpOptions() method for use in building the cascading dropdown
UrlHelper Url = new UrlHelper(System.Web.HttpContext.Current.Request.RequestContext);
myModel.ullDropdownUrl = Url.Action("GetStates", "Forms", new { }, this.Request.Url.Scheme);

Затем я смог сделать это в javascript, который, НАКОНЕЦ, заставил все это работать:

url: '@Model.fullDropdownUrl'
person Casey Crookston    schedule 04.06.2015