2013-04-05 31 views
7

Tôi hiện đang sử dụng phương pháp này để có được URI tương đối chính xác (độc lập với tình huống triển khai). đang Razor (asp.net MVC 3):Url.Content for javascript

@section JavaScript 
{ 
    <script type="text/javascript"> 
     var _getUrl = "@Url.Content("~/bla/di/bla")"; 
    </script> 
} 

riêng js file:

$.ajax({ 
    url: _getUrl, 

Bạn có nghĩ đó là một cách tiếp cận tốt hơn?

+0

Tập lệnh của bạn phải nằm trong tệp js có thể thu nhỏ/có thể lưu trữ riêng biệt. – asawyer

+0

Tôi cũng làm như vậy, nhưng tôi không chắc đó có phải là điều tốt hay không. +1 cho câu hỏi :) –

+2

@asawyer - không chắc chắn ý kiến ​​của bạn là gì ... – cs0815

Trả lời

6

Cá nhân tôi thích sử dụng HTML5 đĩa dữ liệu * thuộc tính hoặc bao gồm URL là một phần của một số DOM yếu tố mà tôi không phô trương AJAXify.

Điều này là bạn không bao giờ viết các cuộc gọi $.ajax bay vòng quanh như vậy. Bạn viết chúng tương ứng với một số sự kiện DOM. Ví dụ như nhấp vào một neo. Trong trường hợp này nó tầm thường, bạn chỉ cần sử dụng một helper HTML để tạo neo này:

@Html.ActionLink("click me", "someAction", "somecontroller", new { id = "123" }, new { @class = "link" }) 

và sau đó:

$('.link').click(function() { 
    $.ajax({ 
     url: this.href, 
     type: 'GET', 
     success: function(result) { 
      ... 
     } 

    }); 
    return false; 
}); 

hoặc có thể bạn đang AJAXifying một hình thức:

@using (Html.BeginForm("SomeAction", "SomeController", FormMethod.Post, new { id = "myForm" })) 
{ 
    ... 
} 

và sau đó:

$('#myForm').submit(function() { 
    $.ajax({ 
     url: this.action, 
     type: this.method, 
     data: $(this).serialize(), 
     success: function(result) { 
      ... 
     } 
    }); 
    return false; 
}); 

An ví dụ khác là sử dụng các thuộc tính data- * của HTML5 khi một url thích hợp không có sẵn trên phần tử DOM tương ứng. Giả sử bạn muốn gọi một hành động điều khiển với AJAX khi lựa chọn một thay đổi thả xuống. Hãy suy nghĩ ví dụ về các tầng xếp chồng.

Sau đây là cách thả xuống của bạn có thể trông giống như:

@Html.DropDownListFor(x => x.SelectedValue, Model.Values, new { id = "myDdl", data_url = Url.Action("SomeAction") }) 

và sau đó:

$('#myDdl').change(function() { 
    var url = $(this).data('url'); 
    var selectedValue = $(this).val(); 
    $.getJSON(url, { id: selectedValue }, function(result) { 
     ... 
    }); 
}); 

Như bạn có thể thấy bạn không thực sự cần _getUrl biến javascript toàn cầu này mà bạn khai báo trong của bạn lượt xem.

+0

+1 Tôi sắp nhập một ví dụ về điều này nhưng bạn đã viết gọn gàng. Ngoài ra tôi nên chỉ ra tôi khá chắc chắn tôi đã học được kỹ thuật từ bạn. – asawyer

+0

@ darin-dimitrov đó là một câu trả lời khá hay. Mặc dù có thể thêm html không cần thiết vào trang trong một số trường hợp nhất định (ví dụ: nếu "nhấp chuột" không có ý nghĩa và bạn cần sử dụng trường ẩn hoặc phần tử DOM khác để lưu trữ giá trị). – LiverpoolsNumber9

+3

Tại sao nó không cần thiết? Điều này cho phép ứng dụng của bạn vẫn hoạt động ngay cả khi đã tắt javascript. Điều này được gọi là tăng cường tiến bộ. –

0

tôi sẽ làm như sau:

Razor C# kịch bản trước Javascript

@{ 
    var myUrlString = Url.Action("ActionName", new { controller="ControllerName" }); 
} 

Javascript

$.ajax('@myUrlString',{ 
    // options 
}); 

Bạn cũng có thể sử dụng Url.RouteUrl hoặc Url.HttpRouteUrl.

EDIT - hiển thị ví dụ với tập tin JS tách

Razor tập tin

@{ 
    var myServerGeneratedValue = Url.Action("ActionName", new{controller="ControllerName"}); 
} 
<script type="text/javascript"> 
    var myHelperObject = new MyHelperObject(); 
    myHelperObject.Init('@myServerGeneratedValue'); 
</script> 

JS

var MyHelperObject = function(){ 

    this.Init = function(serverGeneratedValue){ 
     // do something with serverGeneratedValue 
    }; 

}; 
+0

Tên hành động có thể là một chuỗi, loại anon là không cần thiết. – asawyer

+0

Tôi thích điều này vì nó đảm bảo rằng các URI gửi đi được giữ đồng bộ nếu các thay đổi định tuyến. Tuy nhiên, điều này yêu cầu mã javascript để ngồi trong chế độ xem! – cs0815

+0

@asawyer Tên hành động ** là ** một chuỗi và "loại anon" là cần thiết nếu bạn định tuyến đến một bộ điều khiển/khu vực khác từ hiện tại. Ngoài ra, bạn sẽ thêm ID hoặc bất kỳ dữ liệu định tuyến nào khác mà không có nó? – LiverpoolsNumber9