Помогите пожалуйста... Я видел несколько сообщений об этом, но они, похоже, не помогают...
У меня есть определенный маршрут, который отлично работает при вызове напрямую; 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®ion=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 }
);
}
}
Что, если вы измените URL-адрес внутри $.ajax на "/getlocationdata" (вместо просто "getlocationdata")?
Похоже, вы пытаетесь отправить данные через строку запроса (передавая параметры через опцию 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®ion=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);
}
});