2013-04-27 8 views
12

Używam kodu JavaScript do wywoływania web API MVC. To działa dobrze, gdy obecna ścieżka to:Ścieżka MVC "~" w javascript

http://localhost/myApp/Administrator

ale nie gdy droga prądu jest:

http://localhost/myApp/Administrator/

pojawia się błąd The resource cannot be found. Poniżej znajduje się kod:

$.getJSON("api/UserApi", 
    function (data) { 
     ...    
    }); 

nie chcę użyć bezwzględny adres URL w kodzie, np .:

$.getJSON("http://localhost/myApp/api/UserApi",   
    function (data) { 
     ...  
    }); 

Bezwzględna URL nie działa dobrze, ale brakuje mu elastyczności. Czy istnieje sposób na zrobienie tego samego, co poniżej?

$.getJSON("~/api/UserApi",   
    function (data) { 
     ... 
    }); 

ASP.NET obsługuje zastąpienie znaku „~” z toru głównego bieżącej aplikacji, np

http://localhost/myApp

Jednakże, „~” postać nie jest obsługiwana w plikach JavaScript . Jak mogę zrobić to samo?

JavaScript jest w samodzielnym pliku, który nie może używać instrukcji ASP.NET, takich jak Url.Content. Czy istnieje lepszy sposób na zrobienie tego?

Znalazłem następującą metodę. Czy są jakieś lepsze rozwiązania ?:

1) Wpisz poniższy kod w .cshtml pliku

2) Przeczytaj currentDomain zmiennej z pliku .js:

$.getJSON(currentDomain + "/api/UserApi",   
    function (data) { 
     ...   
}); 

Odpowiedz

13

Jeśli próbujesz uzyskać link do działania, można zdefiniować JavaScript variales w widoku, które będą wypełniane Url.Action:

<script type="text/javascript"> 
    var userApiPath = '@(Url.Action("userApi", "api"))'; 
</script> 

A później użyć tej zmiennej w pliku JS:

$.getJSON(userApiPath,   
    function (data) { 
}); 

Jeśli chcesz ogólną ścieżkę dostępu do aplikacji, można zrobić coś takiego:

<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> 

Później użyj tej zmiennej w swoich plikach JS. Oczywiście nie musisz do tego używać string.Format, to tylko przykład.

EDIT:

Możesz również rozważyć użycie RazorJS.

+0

link do razorjs nie działa – Alok

2

masz wypróbowałem URL helper? To pozwala na wygenerowanie w pełni kwalifikowany adres URL dla kontrolera/działania, takie jak:

@Url.Action("Index", "Home", etc...) 

referencyjny: MSDN

UPDATE
Zauważyłem, że były odnoszące się do pisania dynamicznych linków do swoich js plik. Nie powinieneś zakodować adresów URL w swoich skryptach, utrudni to twój kod. Co się stanie, jeśli jutro zmienisz domeny i zapomnisz zmienić adresy URL w jednym z plików skryptów? Powinieneś przekazać adres URL jako parametr do funkcji JS ze strony .cshtml.

+0

Tak, nie chcę do ciężkiej domeny kod do. Plik js, więc chcę znaleźć sposób, który jak znak '~' w pliku CSHTML, który może zautomatyzować zastąpienie znaku '~' bieżącą domeną, wydaje się, że nie ma możliwości zrobienia tego w pliku JS, więc myślę, że mam aby teraz pobrać bieżącą nazwę domeny z pliku CSHtml, a następnie przekazać ją do js fi le. – sam

2
@Url.Action 

dla Javascript

@Url.Content 

CSS i JS Plik Dodawanie.

+1

Javascript jest w samodzielnym pliku, który nie może używać instrukcji asp.net, czy jest lepszy sposób na zrobienie tego? – sam

0

w widoku zestaw URL strony:

<script type="text/javascript"> 
    var PageUrl = '@Url.Action("Index","Home")'; 
</script> 

następnie w pliku 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 
    } 
}); 

}

Powiązane problemy