Вызов JQuery Ajax выдает ошибку 404 «Ресурс не найден», но нормальный URL-вызов в порядке - PullRequest
7 голосов
/ 17 июня 2009

У меня странная проблема при использовании вызова JQuery в моем проекте ASP.NET MVC. Я обнаружил, что вызов Ajax дает 404 (ошибка ресурса не найдена). Но когда я использую обычный URL-вызов GET, я могу без проблем вызвать сервер. Есть идеи, почему это так?

Это мой код ASP.NET MVC

public class ViewRecordController: Controller
{
  public JSONResult GetSoftwareChoice(string username)
  {
     return Json(username);
  }
}

Это мой код JQuery:

$(function() {
$("#username").click(function() {
        $.getJSON("ViewRecord/GetSoftwareChoice", {username:'123'},
    function(data) {
        alert(data);
    });
    });
});

Приведенный выше JQuery выдает ошибку 404. Очевидно, ViewRecord/GetSoftwareChoice не найден на сервере, что касается вызова AJAX.

Но если я наберу это в своем веб-браузере:

http://myapp/ViewRecord/GetSoftwareChoice?username=123

тогда нет проблем.

Это действительно очень странно.

На всякий случай, если вам интересно, это мой маршрут:

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

    routes.MapRoute(
        "Default",                                              // Route name
        "{controller}/{action}/{id}",                           // URL with parameters
        new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
    );

}

Редактировать: я захожу в свой код и обнаружил, что URL-адрес ViewRecord/GetSoftwareChoice?username=123.

Смежный вопрос: Выберите элемент внутри формы, не работающей в JQuery

Ответы [ 7 ]

8 голосов
/ 17 июня 2009

Вместо жесткого кодирования URL, вы можете попробовать UrlHelper:

$(function() {
    $("#username").click(function() {
        var url = '<%= UrlHelper.Action("GetSoftwareChoice", "ViewRecord") %>';
        $.getJSON(url, {username: '123'}, function(data) {
            alert(data);
        });
    });
});
6 голосов
/ 17 июня 2009

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

http://localhost/ViewRecord/ViewRecord/GetSoftwareChoice?username=123

для вызова JSON:

$(function() {
$("#username").click(function() {
        $.getJSON("ViewRecord/GetSoftwareChoice", {username:'123'},
    function(data) {
        alert(data);
    });
    });
});

Поэтому мне просто нужно изменить строку $.getJSON на

$.getJSON("GetSoftwareChoice", {username:'123'},

В качестве альтернативы используйте косую черту:

 $.getJSON("/ViewRecord/GetSoftwareChoice", {username:'123'},
4 голосов
/ 12 декабря 2012
$(function() {
    $("#username").click(function() {
        $.getJSON('<%= Url.Action("GetSoftwareChoice", "ViewRecord")%>',{username: '123'}, function(data) {
            alert(data);
        });
    });
});
1 голос
/ 17 июня 2009

Заменить знак равенства двоеточием:

$(function() {
$("#username").click(function() {
        $.getJSON("ViewRecord/GetSoftwareChoice", {username:'123'},
    function(data) {
        alert(data);
    });
    });
});
1 голос
/ 17 июня 2009

Используйте дополнение Firefox Firebug и смотрите, какой запрос делает Jquery ...

Возможно ли, что страница, на которой запускается этот Jquery, находится в подкаталоге, и в этом случае запрос не будет относительным корнем, как http://myapp/, "напечатанный в" URL-адресе?

Кроме того, я предполагаю, что код, который вы указали выше, на самом деле не тот код, который вы используете (что вполне разумно, я редко публикую код как есть). Поскольку

$.getJSON("ViewRecord/GetSoftwareChoice", {username='123'},

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

0 голосов
/ 12 августа 2014

Старая функция:

function Chart() {

    var url = "../Home/Pie/";
    $.ajax({
        url: url,
        data: {},
        cache: false,
        type: "POST",
        success: function (data) {
            var chartData = data;
            createChart(chartData);
            $(document).bind("kendo:skinChange", createChart);
        },
        error: function (xhr, status, error) {
            $('#alertdialog').html(status);
            $('#alertdialog').dialog('open');
            return false;
        }
    });
}

Ответы: var url = "Home / Pie / "; Удалено ../ из URL

0 голосов
/ 05 сентября 2013

У меня тоже была такая же проблема. После использования Firebug, как это сделал Graviton, я увидел, что мой путь был шатким, поэтому я изменил его на имя своего действия. Get_OrderLine - это имя моего действия в контроллере. inv_item_id - параметр, передаваемый в действие контроллера.

// Update OrderLine data by returning a JSON result
$('#itemsddl').click(function (e) {
    var selectedItem = $(this).val();
    var actionURL = "Get_OrderLine";
    var d = "inv_item_id=" + selectedItem;
    var uom = $('#uom');
    var size = $('#size');
    var unitLbs = $('#unitLbs');
    var totalLbs = $('#totalLbs');
    var shipName = $('#shipName');
    var hazardClass = $('#hazardClass');
    var unnaNo = $('#unnaNo');
    var packingGroup = $('#packingGroup');
    var placard = $('#placard');
    var ergNo = $('#ergNo');
    $.ajax({
        cache: false,
        type: 'GET',
        url: actionURL, 
        data: d,
        datatype: JSON,
        success: function (data) {
            uom.val(data.uom);
            size.val(data.size);
            unitLbs.val(data.unitLbs);
            totalLbs.val(data.totalLbs);
            shipName.val(data.shipName);
            hazardClass.val(data.hazardClass);
            unnaNo.val(data.unnaNo);
            packingGroup.val(data.packingGroup);
            placard.val(data.placard);
            ergNo.val(data.ergNo);
        },
        error: function (xhr, ajaxOptions, thrownError) {
            alert('Failed to query item - ' + thrownError + "\n" + "Full details: " + xhr.responseText);
        }
    });
    e.preventDefault();
});

Это мое действие, которое возвращает результат JSON моему jQuery. Затем функция jQuery обрабатывает отображение из JSON в HTML. Не очень красиво, но это работает.

public ActionResult Get_OrderLine(int? inv_item_id)
{
    HazmatInfoItem item = new HazmatInfoItem();
    item.itemId = "0";
    item.size = "0";
    item.unitLbs = 0;
    item.qty = 0;
    item.totalLbs = item.qty * item.unitLbs;
    item.shipName = "";
    item.hazardClass = "";
    item.unnaNo = "";
    item.packingGroup = "";
    item.placard = "";
    item.ergNo = "";

    var items = from i in hazmatRepository.GetAllItems()
                select i;

    // Get item details
    items = items.Where(i => i.INV_ITEM_ID.Contains(inv_item_id.ToString()));

    foreach (var i in items)
    {
        item.uom = i.UNIT_MEASURE_STD;
        item.size = i.INV_ITEM_SIZE;
        item.unitLbs = 1;
        item.totalLbs = item.unitLbs * item.qty;
        item.shipName = i.PAG_SHIPPING_NAME;
        item.hazardClass = i.HAZ_CLASS_CD;
        item.unnaNo = i.MSDS_ID;
        item.packingGroup = i.PACKING_CD;
        item.placard = i.PAG_PLACARD_TYPE;
    }

    return Json(item, JsonRequestBehavior.AllowGet);
}

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

Надеемся, что эти решения могут помочь кому-то, кто сталкивался с подобной проблемой при попытке использовать .ajax с jQuery и MVC.

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