asp.net-mvc: simbolo del razor ‘@’ nel file js

Ho un file .csHtmlrazor con una funzione javascript che utilizza la funzione @Url.Content C # all’interno dell’URL ajax.
Voglio spostare quella funzione in un file .js riferimento la mia vista.

Il problema è che javascript non “conosce” il simbolo @ e non analizza il codice C #.
C’è un modo per fare riferimento ai file .js dalla vista con il simbolo “@”?

Potresti usare gli attributi HTML5 data-* . Supponiamo che tu voglia eseguire qualche azione quando si fa clic su un elemento DOM come un div. Così:

 
Click me

e poi nel tuo file javascript separato potresti lavorare discretamente con il DOM:

 $('#foo').click(function() { var url = $(this).data('url'); // do something with this url }); 

In questo modo potresti avere una separazione netta tra markup e script senza che tu abbia mai bisogno di tag sul lato server nei tuoi file javascript.

Beh, ho appena trovato un motore di razor su nuget che lo fa! Il significato risolve @ syntax!
Si chiama RazorJS .

Il pacchetto Nuget


Aggiornamento 2016:
Il pacchetto non è stato aggiornato per 5 anni e il collegamento al sito del progetto è morto. Non consiglio alle persone di usare questa libreria più.

Un modo per affrontare il problema è:

Aggiunta di una vista parziale con le funzioni javascript alla vista.
In questo modo puoi usare il simbolo @ e tutte le tue funzioni javascript sono separate dalla vista.

Hai due opzioni:

  • Utilizzare il valore come parametro nella funzione e wire-up nella vista
  • Crea uno spazio dei nomi (anziché una variabile di livello pubblico che è considerata una ctriggers pratica in JS) e imposta questo valore nella parte superiore della pagina e poi usalo nella tua js

Per esempio:

  var MyCompany = { MyProject: { MyVariable:"" } }; 

E poi a tuo avviso, impostalo:

 MyCompany.MyProject.MyVariable = @.... 

AGGIORNARE

Potresti meravigliarti che non ci sia nulla di buono a causa dell’accoppiamento, beh, è ​​vero, stai accoppiando js e view. Questo è il motivo per cui gli script devono essere ignari della posizione in cui sono in esecuzione in modo che sia un sintomo di organizzazione non ottimale dei file.

Ad ogni modo c’è una terza opzione per creare un motore di visualizzazione ed eseguire i file js sul razor e inviare i risultati indietro. Questo è più pulito ma molto più lento, quindi non consigliato.

Per ottenere la variabile @ nel tuo file .js dovrai utilizzare una variabile globale e impostare il valore di tale variabile dalla vista mvc che sta facendo uso di quel file .js.

File JavaScript:

 var myValue; function myFunc() { alert(myValue); } 

Visualizza il file:

  

Assicurati che tutte le chiamate alla tua funzione avvengano DOPO che il valore è stato impostato dalla vista.

Probabilmente questo non è l’approccio giusto. Considerando la separazione delle preoccupazioni. Dovresti avere un data injector sulla tua class JavaScript e nella maggior parte dei casi i dati sono JSON .

Crea un file JS nella cartella degli script e aggiungi questo riferimento alla tua View

  

Ora, considera una class letterale JavaScript nel tuo yourJsFile.js :

 var contentSetter = { allData: {}, loadData: function (data) { contentSetter.allData = eval('(' + data + ')'); }, setContentA: function () { $("#contentA").html(allData.contentAData); }, setContentB: function () { $("#contentB").html(allData.contentAData); } }; 

Dichiara anche una class

 public class ContentData { public string ContentDataA { get; set } public string ContentDataB { get; set } } 

Ora, dalla tua Action fai questo:

 public ActionResult Index() { var contentData = new ContentData(); contentData.ContentDataA = "Hello"; contentData.ContentDataB = "World"; ViewData.Add("contentData", contentData); } 

E dal tuo punto di vista:

 

Recentemente ho bloggato su questo argomento: Generazione di file JavaScript esterni usando le visualizzazioni del razor parziale .

La mia soluzione è di usare un attributo personalizzato ( ExternalJavaScriptFileAttribute ) che rende una vista Razor parziale così com’è e poi la restituisce senza i tag circostanti. Questo lo rende un file JavaScript esterno valido.

Di solito avvolgo JS che ha bisogno di accedere alle proprietà del modello, nelle funzioni e poi passare @qualcosa nella vista. Per esempio

  

nella vista aggiungo invocazione funzione tramite (solo un esempio):

  

Penso che tu sia bloccato a dover inserire quel codice JS nella Vista. Il parser Razor, per quanto ne so, non guarderà i file .js, quindi qualsiasi cosa tu abbia che usi @ non funzionerà. PLus, come hai individuato, JavaScript di per sé non ama questo personaggio @ che gironzola senza motivo, a parte poi, per esempio, in una stringa.