Cách truy cập biến javascript trong @ URL.Action ()


77

Làm cách nào để truy cập giá trị JavaScript bên trong @URL.Action()? cái gì đó như:

<script type="text/javascript">
function name(myjavascriptID)
{
     jQuery("#list_d").jqGrid('setGridParam', { url: '@URL.Action("download file", "download", new { id = <myjavascriptID> })', page: 1 });

}
</script>

Câu trả lời:


139

Bạn không thể. JavaScript không thực thi khi tạo URL hành động. Những gì bạn có thể làm, là làm một cái gì đó như sau:

function name(myjavascriptID)    {
     var link = '@Url.Action("download file", "download", new { id = "-1" })';
     link = link.replace("-1", myjavascriptID);

     jQuery("#list_d").jqGrid('setGridParam', { url: link, page: 1 });
}

Cảm ơn câu trả lời của bạn, nó hoạt động với một sửa đổi nhỏ: thay vì link.hreftôi cần sử dụng link. Cảm ơn rất nhiều!
Bolu

Điều gì sẽ xảy ra nếu id sẽ là chuỗi như "Hello world"?
Nic

Ý tưởng là để -1 là một cái gì đó có thể nhận dạng duy nhất trong chuỗi, để bạn thay thế bằng bất kỳ thứ gì bạn muốn. Bạn cần đảm bảo Hello World được mã hóa, giống như Hello + World. Nhưng có, thay thế nó với bất cứ điều gì bạn muốn
Brian Mains

2
không có giải pháp nào sạch hơn?
juFo

1
URL vốn remove tiền tố trước khi @URL.Action đến @Url.Actionvì nó cho thấy biên dịch lỗi thời gian
Shaiju T

17

Tôi làm một cái gì đó khá tương tự, nhưng ít dài dòng hơn:

var myUrl = '@Url.Action("Solution","Partner")/' + myjavascriptID;
$.ajax.load(myUrl); // or whatever

Chúng tôi có thể làm điều này vì định tuyến và cuối cùng là Url. Hành động với các tham số từ điển tuyến đường chuyển thành một URI giống như sau:

http://localhost:41215/Partner/Solution?myJavascriptID=7

Chỉ là sự lựa chọn thứ hai, bởi vì như một ông già thông thái đã từng nói "Chính những lựa chọn của chúng ta, Harry, cho thấy chúng ta thực sự là gì, hơn rất nhiều so với khả năng của chúng ta."


Nó sẽ phá vỡ cấu hình RoutAttribute: (((
Kate

11

Bạn có thể chuyển các biến vào bất kỳ liên kết nào như được hiển thị bên dưới ...

var url = '@Html.Raw(@Url.Action("MethodName", "ControllerName"))' + '?id = ' + myjavascriptID

1

Tương tự như câu trả lời của Brian Mains, bạn có thể định dạng chuỗi url của mình thay vì thay thế -1 bằng biến của bạn, đó là nếu giống như tôi, bạn đánh giá tốt hơn là nên đọc. Câu trả lời sau giả định rằng bạn đã sửa đổi Stringnguyên mẫu của như được đề xuất trong câu trả lời này :

var url = unescape('@Url.Action("download file", "download", new { id = "{0}" })').format(myjavascriptID);

Cuộc unescapegọi là cần thiết nếu bạn muốn giải mã của bạn {0}. Tôi thích sự thay thế này, vì nó giúp dễ dàng có nhiều tham số từ các biến JS hơn. Ví dụ:

var url = unescape('@Html.Raw(Url.Action("Action", "Controller", new { id = "{0}", name = "{1}" }))').format(myID, myName);

Tôi đã thêm Html.Rawtrong ví dụ thứ hai của mình để tránh có &amptrong chuỗi url.


Thêm câu trả lời của bạn với lỗi này và nhận được câu trả lời hoàn hảo: stackoverflow.com/a/36981170/453142
David LeTourneau

0

Bạn có thể tạo mã JavaScript trong C # theo cách này:

function fun(jsId) {
  var aTag = '<a href="@Html.Raw(@Url.Action("ActionName", "ControllerName", new { objectId = "xxx01xxx" }).Replace("xxx01xxx", "' + jsId + '"))">LINK</a>';
}

Đây là mã từ câu hỏi được viết lại bằng kỹ thuật này:

function name(myjavascriptID) {
  jQuery("#list_d").jqGrid('setGridParam', { url: '@Html.Raw(@URL.Action("download file", "download", new { id = "XXXmyjavascriptIDXXX" }).Replace("XXXmyjavascriptIDXXX", "' + myjavascriptID + '"))', page: 1 });
}

0

Bạn có thể thay thế url như mã bên dưới

var jsUrl = '@Url.Action("action", "controller")'; // ## is the token
var getUrl = jsUrl.replace('action', action).replace('controller', controller)  
$("#RenderPartial").load(getUrl); 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.