MVC "~" путь в javascript
Я использую JavaScript-код для вызова веб-API MVC. Он отлично работает, когда текущий путь:
http://localhost/myApp/Administrator
но он не работает, когда текущий путь:
http://localhost/myApp/Administrator/
Я получаю ошибку The resource cannot be found
. Ниже приведен код:
$.getJSON("api/UserApi",
function (data) {
...
});
Я не хочу использовать абсолютный URL-адрес в коде, например:
$.getJSON("http://localhost/myApp/api/UserApi",
function (data) {
...
});
Абсолютный URL-адрес работает нормально, но ему не хватает гибкости. Есть ли способ сделать то же самое, что и ниже?
$.getJSON("~/api/UserApi",
function (data) {
...
});
ASP.NET поддерживает замену символа "~" на текущий корневой путь приложения, например:
http://localhost/myApp
Однако символ "~" не поддерживается в файлах JavaScript. Как я могу выполнить одно и то же?
JavaScript находится в автономном файле, который не может использовать утверждения ASP.NET, такие как Url.Content
. Есть ли лучший способ сделать это?
Я нашел следующий метод. Есть ли лучшие решения?:
1) Напишите код ниже в файле .cshtml
<script type="text/javascript">
var currentDomain = '@Url.Content("~")';
</script>
2) Прочитайте переменную currentDomain
из файла .js:
$.getJSON(currentDomain + "/api/UserApi",
function (data) {
...
});
Ответы
Ответ 1
Если вы пытаетесь получить ссылку на действие, вы можете определить переменные JavaScript в своем представлении, которые будут заполнены с помощью Url.Action
:
<script type="text/javascript">
var userApiPath = '@(Url.Action("userApi", "api"))';
</script>
И позже используйте эту переменную в вашем JS файле:
$.getJSON(userApiPath,
function (data) {
});
Если вам нужен общий путь к вашему приложению, вы можете сделать что-то вроде этого:
<script type="text/javascript">
var path = '@(string.Format("{0}://{1}{2}",
Request.Url.Scheme,
Request.Url.Host,
(Request.Url.IsDefaultPort) ? "" : string.Format(":{0}",
Request.Url.Port)))';
</script>
И позже используйте эту переменную где-то в ваших JS файлах. Конечно, вам не нужно использовать string.Format
для этого, это просто пример.
EDIT:
Вы также можете использовать RazorJS.
Ответ 2
Вы пробовали URL helper
? Он позволяет вам создать полный URL-адрес вашего контроллера/действия, например:
@Url.Action("Index", "Home", etc...)
Ссылка: MSDN
UPDATE
Я заметил, что вы ссылаетесь на запись динамических URL-адресов в ваш .js файл. Вы не должны жестко программировать URL-адреса в своих сценариях, это сделает ваш код сложнее в обслуживании. Что делать, если завтра вы меняете домены и забываете менять URL-адреса в одном из файлов script? Вы должны передать URL-адрес в качестве параметра своей функции JS с вашей .cshtml-страницы.
Ответ 3
@Url.Action
для Javascript
@Url.Content
для добавления CSS и JS файлов.
Ответ 4
В URL-адрес страницы вида просмотра:
<script type="text/javascript">
var PageUrl = '@Url.Action("Index","Home")';
</script>
затем в файле js:
function MyFunc() {
var $form = $('form[id="Form"]');
$.ajax({
type: 'GET',
url: PageUrl+"/MyActionName",
data: $form.serialize(),
cache: false,
error: function (xhr, status, error) {
},
success: function (result) {
//do something
}
});
}