2012-09-20 36 views
9

Tôi đang cố gắng sử dụng phương thức Url.Action() trong tệp js của tôi để xác định các url cho các cuộc gọi ajax của mình. Cho đến nay tôi đã thất bại.ASP.NET MVC Url.Action trong JQuery không được nhận dạng

$.ajax(
{ 
    type: "POST", 
    url: '@Url.Action("SomeAction", "SomeController")', 
    data: { 
     fileID: rightClickedFileId 
    }, 
    success: function (data) { 

    } 
}); 

Nếu tôi xác định url theo cách này, trình duyệt sẽ cố gắng để gửi dữ liệu đến

http://localhost:5907/FileManager/@Url.Action(%22SomeAction%22,%20%22SomeController%22) 

và kết quả là cuộc gọi ajax của tôi thất bại.

Tuy nhiên, nếu tôi sử dụng '/SomeController/SomeAction' thay vào đó, mọi thứ đều hoạt động tốt.

Tác phẩm thứ hai ok, nhưng tôi tự hỏi vấn đề đầu tiên? Có thể do cấu hình định tuyến không?

Cảm ơn.

Trả lời

20

Url.Action là một phương thức trợ giúp html sẽ hoạt động trong chế độ xem dao cạo của bạn, chứ không phải trong tệp javascript bên ngoài của bạn.

Điều bạn có thể làm là nhận url tương đối với phương thức hành động của mình bằng cách sử dụng phương thức trợ giúp Url.Action trong chế độ xem dao cạo và đặt biến đó thành biến javascript và sử dụng tệp đó trong tệp js bên ngoài của bạn. Khi thực hiện việc này, Luôn đảm bảo sử dụng tính năng đặt tên không gian JavaScript để tránh xung đột có thể xảy ra với các biến toàn cục hiện có.

Bạn có thể thêm mã này trong _Layout.cshtml

<script type="text/javascript"> 

    var yourApp = yourApp || {}; 
    yourApp.Urls = yourApp.Urls || {}; 
    yourApp.Urls.baseUrl = '@Url.Content("~")'; 
    yourApp.Urls.editUserUrl= '@Url.Action("Edit","User")'; 

</script> 

Hoặc theo quan điểm cụ thể trang của bạn,

@section Scripts 
{ 
    <script type="text/javascript"> 

    var yourApp = yourApp || {}; 
    yourApp.Urls = yourApp.Urls || {}; 
    yourApp.Urls.baseUrl = '@Url.Content("~")'; 
    yourApp.Urls.editUserUrl= '@Url.Action("Edit","User")'; 

    </script> 
    <script src="~/Scripts/PageSpecificExternalJsFile.js"></script>  
} 

Bây giờ trong bên ngoài tập tin javascript, bạn có thể truy cập vào nó như

var urlToEditUser = yourApp.Urls.editUserUrl; 
//you can use urlToEditUser now 

// Or With the base url, you may safely add the remaining part of your url. 
var urlToEditUser2 = yourApp.Urls.baseUrl+"User/Edit"; 
//you can use urlToEditUser2 now 

Luôn sử dụng Url.Action hoặc Url.RouteUrl phương thức trợ giúp html để tạo url tương đối cho các phương thức hành động. Nó sẽ chăm sóc xây dựng chính xác url bất kể trang/đường dẫn hiện tại của bạn.

Nếu bạn muốn làm điều tương tự bên trong bộ điều khiển góc/dịch vụ dữ liệu, vv, hãy xem this post giải thích cách sử dụng nhà cung cấp giá trị góc để thực hiện tương tự.

+0

nhưng không viết mã js để xem MVC cũng là một thực tế xấu? Tôi –

+0

để có được Đường dẫn đến một biến toàn cầu, Nó là tốt. Đây là cách duy nhất bạn có thể lấy đường dẫn bằng phương thức của trình trợ giúp và chuyển tới tệp js bên ngoài. – Shyju

7

Bạn không thể sử dụng '@Url.Action("SomeAction", "SomeController")' trong tệp js, vì đây là trình trợ giúp ASP.NET MVC, nếu bạn đặt mã của mình vào chế độ xem mọi thứ sẽ hoạt động.

+0

Cảm ơn, không biết điều đó. Tôi sẽ đi với hardcoding ... –

1

Cách tiếp cận của tôi tương tự như @ Shyju, ngoại trừ thay vì đặt một biến trong chế độ xem Dao cạo, tôi gọi hàm init trong JavaScript của mình và chuyển tất cả thông số mà tôi cần Dao giải thích.

Vì vậy, các mã sẽ trông như thế này:

MyScript.init({ 
    editUserUrl: "@Url.Action("Edit","User")", 
    anotherUrl: "@Url.Action("AnotherUrl", "User")" 
}) 

Sau đó, trong JavaScript:

var m_options; 
MyScript.init = function(options) { 
    m_options = options; 
} 

// use with m_options.editUserUrl here 
$.ajax(
{ 
    type: "POST", 
    url: m_options.editUserUrl, 
    data: { 
     fileID: rightClickedFileId 
    }, 
    success: function (data) { 
    } 
}); 

Tôi đã viết một bài chi tiết về nó ở đây: http://blog.blanklabs.com/2015/02/aspnet-mvc-refactoring-friendly.html

0

bạn có thể viết nó như cách này chỉ

url:'/controllername/Actionname', 
Các vấn đề liên quan