2013-04-27 19 views
12

Uso codice JavaScript per chiamare un'API Web MVC. Funziona bene quando il percorso corrente è:MVC "~" percorso in javascript

http://localhost/myApp/Administrator

ma non riesce quando il percorso corrente è:

http://localhost/myApp/Administrator/

ottengo l'errore The resource cannot be found. Di seguito è riportato il codice:

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

Non voglio usare un URL assoluto nel codice, ad es .:

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

L'URL assoluto non funzionare bene, ma manca di flessibilità. C'è un modo per fare la stessa cosa di seguito?

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

ASP.NET supporta la sostituzione del carattere "~" con il percorso principale dell'applicazione corrente, ad esempio:

http://localhost/myApp

Tuttavia, il carattere "~" non è supportato in file JavaScript . Come realizzo la stessa cosa?

JavaScript si trova in un file autonomo che non può utilizzare istruzioni ASP.NET come Url.Content. C'è un modo migliore per farlo?

Ho trovato il seguente metodo. Ci sono delle soluzioni migliori ?:

1) Scrivi il codice di seguito in un file .cshtml

2) leggere la variabile currentDomain dal file .js:

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

risposta

13

Se stai cercando di ottenere link per un'azione, è possibile definire JavaScript variales a suo avviso che verrà popolata con Url.Action:

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

E più tardi utilizzare questa variabile nel file JS:

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

Se si desidera un percorso generale per la vostra applicazione, si può fare qualcosa di simile:

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

E in seguito utilizzare questa variabile da qualche parte nei file JS. Ovviamente non è necessario utilizzare string.Format per fare ciò, questo è solo un esempio.

EDIT:

Si può anche considerare l'utilizzo di RazorJS.

+0

a razorjs non funziona più – Alok

2

Avete provato il URL helper? Esso consente di generare un URL completo per il controller/azione, come ad esempio:

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

Riferimento: MSDN

UPDATE
ho notato si stia riferendo alla scrittura di URL dinamici nelle vostre .js file. Non dovresti inserire gli URL hard-code nei tuoi script, renderà il tuo codice più difficile da mantenere. Cosa succede se domani cambi domini e dimentichi di modificare gli URL in uno dei file di script? Dovresti passare l'URL come parametro alla tua funzione JS dalla tua pagina .cshtml.

+0

Sì, io non voglio difficile nome di dominio codice al. js file, quindi voglio trovare un modo che come il carattere '~' nel file CSHTML che può automatizzare sostituire il carattere '~' nel dominio corrente, sembra che non ci sia modo di farlo nel file JS, quindi penso di avere per ottenere il nome di dominio corrente dal file CSHtml ora, quindi passarlo a js fi le. – sam

2
@Url.Action 

per il Javascript

@Url.Content 

per i CSS e JS file Aggiunta.

+1

Il javascript è in un file standalone che non può usare l'istruzione asp.net, esiste un modo migliore per farlo? Il collegamento – sam

0

In visualizzazione di una pagina insieme Url:

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

poi in un file 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 
    } 
}); 

}