Asp.Net Mvc Url.Action во внешнем js файле?
В внешнем js файле я не могу использовать
url = "@Url.Action("Action", "Controller")"
//url output : @Url.Action("Action", "Controller")
//I get IllegalPath Name error.
Когда я пишу вот так:
url = "/Controller/Action"
И если проект находится под подпапкой, то скрипты не работают. Мне нужно что-то подобное в качестве относительного URL:
url = "~/Controller/Action"
Как это сделать? Спасибо.
Ответы
Ответ 1
Поскольку .js файлы не обрабатываются механизмом просмотра asp.net mvc, вы просто не можете использовать какой-либо код С#. Я бы предложил использовать ненавязчивый подход, что-то вроде этого
<div id="loader" data-request-url="@Url.Action("Action", "Controller")"></div>
И в javascript используйте значение data-request-url
$(function(){
$('#loader').click(function(){
var url = $(this).data('request-url');
alert(url);
});
});
Ответ 2
Я не уверен, что это самое элегантное решение, но я сделал различие между регистрами и реальной реализацией во внешних скриптах, чтобы:
<script>...</script>
... include all the external scripts I need
$(document).ready(function(){
//get all the information you need from your MVC context
//before going out of context and into the scripts
var url = '@Url.Action("Action", "Controller")';
RegisterMyFunction(url, other parameters ..);
RegisterAnotherFunction(url, others...);
}
Итак, в моих представлениях у меня были только функции регистра, а в сценариях были специальные значения в качестве параметра, чтобы делать все, что я хотел.
Надеюсь, что это поможет,
Ответ 3
Вот образец, который я использовал. Это немного больше шагов, но мне нравится, что все мои URL-адреса находятся в одном организованном месте в представлении.
В нижней части моего представления я включу секцию Scripts, которая содержит такие URL-адреса:
@section Scripts
{
<script type="text/javascript">
myJavaScriptObject.firstUrl = '@Url.Action("Action1", "Controller", new {id = Model.Id})';
myJavaScriptObject.secondUrl = '@Url.Action("Action2", "Controller", new {id = Model.Id})';
</script>
}
Внутри моего JavaScript-класса (который находится во внешнем файле) я буду ссылаться на url следующим образом:
var myJavaScriptObject = {
firstUrl: '',
secondUrl: '',
docReady: function() {
$.get(myJavaScriptObject.firstUrl, function(data) { do something... });
}
}
Я понимаю, что записи не нужно ссылаться внутри класса, но мне нравится иметь их там для моей домашней работы.