MVC 5 маршрут не работает

0

Помогите пожалуйста... Я видел несколько сообщений об этом, но они, похоже, не помогают...

У меня есть определенный маршрут, который отлично работает при вызове напрямую; http://localhost: 53505/GetLocationData/Canada/Ontario/Toronto и я получаю именно то, что я ожидал, - результат моего AddressController.

...

Теперь, в моем приложении, мой ClientController запускает представление ~/Views/Client/Index.cshtml

посредством вызова Клиента/Индекса

Этот вид имеет javascript.ajax, который пытается асинхронно вызывать одну и ту же функцию AddressController, отмеченную выше, после получения результата от хорошей службы GEO-IP: $(document).ready(function() {

  var urlGeoIeoip = "http://smart-ip. net/geoip-json?callback=?"; $.ajax({ url: urlGeoIeoip, type: "GET", dataType: "json", timeout: 2000, success: function (geoipdata) { $("#AddressCity").data("kendoComboBox").value(geoipdata.city); $("#AddressState").data("kendoComboBox").value(geoipdata.region); $("#AddressCountry").data("kendoComboBox").value(geoipdata.countryName); var $form = $(this); $.ajax({ url: "getlocationdata", type: "GET", data: { 'country': geoipdata.countryName, 'region': geoipdata.region, 'city': geoipdata.city }, timeout: 500, success: function(data) { var $target = $($form.attr("data-htci-target")); var $newHtml = $(data); $target.replaceWith($newHtml); } }); } }).fail(function(xhr, status) { if (status === "timeout") {//log timeout here } }); });

Это работает, НО запрос получает ответ от моего ClientController, а не контроллера адреса!

Я вижу, что он входит в /Client/Index с Request.Url: http://localhost: 53505/Client/Index/GetLocationData?country=Canada&region=Ontario&city=Toronto Почему он не достигает моего AddressController?

Вот мой RouteConfig:

   public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");

        routes.MapRoute(
            name: "GetLocationData",
            url: "getlocationdata/{country}/{region}/{city}",
            defaults: new { controller = "Address", action = "GetLocationData"}
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
Теги:
asp.net-mvc
asp.net-mvc-routing

2 ответа

1
Лучший ответ

Что, если вы измените URL-адрес внутри $.ajax на "/getlocationdata" (вместо просто "getlocationdata")?

  • 0
    Попробовал это - вызов ajax куда-то улетает в космос и попадает в черную дыру. Контроллеры не получают вызов AJAX для этого веб-приложения. Я не уверен, где это "/ что-нибудь? Вызов
  • 0
    Теперь это похоже на работу - возможно, там было что-то в кеше? Все хорошо сейчас
0

Похоже, вы пытаетесь отправить данные через строку запроса (передавая параметры через опцию data):

$.ajax({
        url: "getlocationdata",
        type: "GET",
        data: { 'country': geoipdata.countryName, 'region': geoipdata.region, 'city': geoipdata.city },
        timeout: 500,
        success: function(data) {
            var $target = $($form.attr("data-htci-target"));
            var $newHtml = $(data);
            $target.replaceWith($newHtml);
        }
    });

ВАРИАНТ 1 Из-за этого вы должны определить свой маршрут следующим образом:

routes.MapRoute(
        name: "GetLocationData",
        url: "getlocationdata",
        defaults: new { controller = "Address", action = "GetLocationData"}
    );

Это прослушивает маршрут: http://localhost:53505/GetLocationData?country=Canada&region=Ontario&city=Toronto

Затем вы можете использовать UrlHelper для получения URL-адреса в вашем представлении (при условии, что cshtml ниже):

$.ajax({
        url: "@Url.RouteUrl("GetLocationData")", //Notice this is the Name of the Route
        type: "GET",
        data: { 'country': geoipdata.countryName, 'region': geoipdata.region, 'city': geoipdata.city },
        timeout: 500,
        success: function(data) {
            var $target = $($form.attr("data-htci-target"));
            var $newHtml = $(data);
            $target.replaceWith($newHtml);
        }
    });

Это позволит вам свободно изменять маршрут в конфигурации маршрута, не изменяя ваши представления.

ВАРИАНТ 2 Если вы хотите сохранить маршрут таким, как он есть (используя данные inurl), вам нужно будет определить свой вызов ajax следующим образом:

    $.ajax({
        url: "/getlocationdata/" + geoipdata.countryName + "/" + geoipdata.region + "/" + geoipdata.city, //This will manually build the route as you defined it
        type: "GET",
        timeout: 500,
        success: function(data) {
            var $target = $($form.attr("data-htci-target"));
            var $newHtml = $(data);
            $target.replaceWith($newHtml);
        }
    });

Вы все равно можете использовать UrlHelper для этого типа маршрута, но вы не можете легко его использовать в javascritpt:

    $.ajax({
        url: "@Url.RouteUrl("GetLocationData", new{country = "SomeCountry",region="SomeRegion",city="SomeCity"})", //unfortunately, you need these while you are in C# code
        type: "GET",
        timeout: 500,
        success: function(data) {
            var $target = $($form.attr("data-htci-target"));
            var $newHtml = $(data);
            $target.replaceWith($newHtml);
        }
    });
  • 0
    Спасибо за примечания - это прояснило другую проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню