2009-06-17 39 views
7

Tôi gặp sự cố lạ khi sử dụng cuộc gọi JQuery trong dự án ASP.NET MVC của mình. Tôi thấy rằng cuộc gọi Ajax cho 404 (lỗi tài nguyên không tìm thấy). Nhưng khi tôi sử dụng cuộc gọi GET URL thông thường, tôi có thể gọi thành công máy chủ mà không gặp bất kỳ sự cố nào. Bất kỳ ý tưởng tại sao điều này là như vậy?Cuộc gọi JQuery Ajax cho lỗi 404 'Không tìm thấy tài nguyên' nhưng lệnh gọi URL thông thường là Fine

này mã ASP.NET MVC của tôi

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

Đây là mã JQuery tôi:

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

Trên đây JQuery mang lại cho tôi một lỗi 404. Rõ ràng là không tìm thấy ViewRecord/GetSoftwareChoice trên máy chủ, khi có liên quan đến cuộc gọi AJAX.

Nhưng nếu tôi gõ này trong trình duyệt web của tôi:

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

thì không có vấn đề.

Điều này thật kỳ lạ.

Chỉ trong trường hợp nếu bạn quan tâm, đây là con đường của tôi:

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 
    ); 

} 

Edit: Tôi bước vào mã của tôi, và thấy rằng các cuộc gọi URL là ViewRecord/GetSoftwareChoice?username=123.

câu hỏi liên quan: Select Element inside Form not working in JQuery

Trả lời

4

tôi khắc phục vấn đề này bằng cách sử dụng Firebug để cho tôi yêu cầu được tạo ra bởi JQuery.Để kinh ngạc của tôi, url tạo là

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

cho cuộc gọi JSON:

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

Vì vậy, tôi chỉ phải thay đổi dòng $.getJSON để

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

Ngoài ra, sử dụng dấu gạch chéo :

$.getJSON("/ViewRecord/GetSoftwareChoice", {username:'123'}, 
+2

.... hoặc vào "/ ViewRecord/GetSoftwareChoice". dấu gạch chéo hàng đầu có nghĩa là đường dẫn tuyệt đối, ngay cả khi bạn không bao gồm tên máy chủ – Javier

+0

Cảm ơn, Javier. Tôi đưa câu trả lời của bạn vào câu trả lời của tôi. – Graviton

+0

Tôi nghĩ Johhny G (và Jarrod trong các ý kiến) đã ngụ ý câu trả lời này. – Charlino

8

Thay vì cứng mã hóa URL, bạn có thể muốn thử một UrlHelper:

$(function() { 
    $("#username").click(function() { 
     var url = '<%= UrlHelper.Action("GetSoftwareChoice", "ViewRecord") %>'; 
     $.getJSON(url, {username: '123'}, function(data) { 
      alert(data); 
     }); 
    }); 
}); 
+0

Chính xác - Tôi nghĩ rằng đó cũng là vấn đề với url tìm nạp jQuery liên quan đến đường dẫn hiện tại, thay vì từ gốc ứng dụng. –

+1

Ngoài ra, +1 để sử dụng FireBug và hiển thị cho chúng tôi kết quả của bảng điều khiển FireBug. –

+0

Tôi không nghĩ rằng UrlHelper hoạt động trong Javascript (tôi đã thử nghiệm nó) ... bạn có chắc nó hoạt động không? – Graviton

1

Sử dụng Firefox Firebug thêm vào, và xem những gì yêu cầu được thực hiện bằng Jquery. ..

Có thể trang Jquery này chạy trong thư mục con, trong trường hợp đó, yêu cầu sẽ không phải là gốc tương đối vì url được nhập là http://myapp/ "?

Ngoài ra, tôi đoán mã bạn đã chỉ định ở trên không thực sự là mã bạn đang sử dụng (điều này hoàn toàn hợp lý, tôi đăng mã một cách thẳng thắn). Bởi vì

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

dấu = giữa tên người dùng và '123' không hợp lệ JS theo như tôi biết. Vì vậy, tôi cá cược có một số chi tiết ngốc nghếch trong mã thực sự gây ra vấn đề.

+0

Tôi đang sử dụng ASP.NET MVC, do đó, không có vấn đề yêu cầu sẽ không được gốc tương đối như http: // myapp/"gõ vào" url là. – Graviton

+0

Tôi cũng đang sử dụng ASP.NET MVC và ban đầu có đường dẫn ajax của tôi là "/ Controller/Action", nhưng do câu trả lời này và lời nhận xét của @ Javier về câu trả lời của Graviton về dấu gạch chéo là một đường dẫn tuyệt đối, tôi phát hiện ra rằng đây không phải là đường dẫn tương đối các ứng dụng đã được đẩy đến máy chủ mà chôn các ứng dụng trong một vài lớp thư mục con khác với môi trường địa phương của tôi. Giải pháp đúng cho tôi là có một đường dẫn hoàn toàn tương đối chứa bộ điều khiển và hành động như var url = "Controller/Action"; –

1

Thay thế dấu bằng với một dấu hai chấm:

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

Xin lỗi! Đó là lỗi đánh máy trong câu hỏi của tôi. Tôi đang sử dụng {username: '123'} trong mã của mình nhưng vô tình gõ {username = '123'} – Graviton

4
$(function() { 
    $("#username").click(function() { 
     $.getJSON('<%= Url.Action("GetSoftwareChoice", "ViewRecord")%>',{username: '123'}, function(data) { 
      alert(data); 
     }); 
    }); 
}); 
0

Tôi cũng gặp vấn đề tương tự. Sau khi sử dụng Firebug như Graviton đã làm, tôi thấy rằng con đường của tôi đã rất lạc quan nên tôi đã thay đổi nó thành tên hành động của tôi. Get_OrderLine là tên của hành động của tôi trong bộ điều khiển của tôi. inv_item_id là thông số được truyền cho hành động của bộ điều khiển.

// 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(); 
}); 

Đây là hành động của tôi mà trả về một kết quả JSON để jQuery tôi. Hàm jQuery sau đó xử lý ánh xạ từ JSON sang HTML. Không phải là rất đẹp, nhưng nó hoạt động.

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); 
} 

Tôi đã thêm một tuyến đường mới để cố gắng xử lý điều này, nhưng đã nhận xét nó để cho phép định tuyến mặc định.

Hy vọng rằng các giải pháp này có thể giúp người khác có vấn đề tương tự khi cố gắng sử dụng .ajax với jQuery và MVC.

+0

Chào mừng bạn đến với Stack Overflow! Vui lòng xem qua stackoverflow.com/about để xem định dạng câu trả lời hữu ích! Các bit mã ở đây cực kỳ dài và không có khả năng được đọc bởi ai đó (đặc biệt là với bao nhiêu câu trả lời khác). Nếu bạn muốn giúp đỡ ai đó gặp phải vấn đề này trong tương lai, hãy xem xét rút ngắn các bit mã của bạn xuống ~ 5-10 dòng từ mã của bạn để thực sự giải quyết vấn đề này! – arturomp

0

Cũ chức năng:

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; 
     } 
    }); 
} 

Đáp: var url = "Home/Pie/"; Đã xóa ../ khỏi url

Các vấn đề liên quan