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
    }
});

}