2015-08-06 10 views
5

Così come si può sapere, la sintassi del rasoio in ASP.NET MVC non funziona nei file JavaScript esterni.Sintassi del rasoio in Javascript esterno

La mia soluzione attuale è mettere la sintassi del rasoio in una variabile globale e impostare il valore di tale variabile dalla vista mvc che sta facendo uso di tale file .js.

file JavaScript:

function myFunc() { 
    alert(myValue); 
} 

MVC Visualizza File:

<script language="text/javascript"> 
    myValue = @myValueFromModel; 
</script> 

Vorrei sapere come posso passare myValue direttamente come parametro alla funzione? Preferisco avere chiamate esplicite con param piuttosto che fare affidamento su globals, tuttavia non sono così entusiasta di javascript.

Come implementarlo con i parametri javascript? Grazie!

risposta

7

Basta che la funzione accetti un argomento e la usi nell'avviso (o ovunque).

external.js

function myFunc(value) { 
    alert(value); 
} 

someview.cshtml

<script> 
    myFunc(@myValueFromModel); 
</script> 

Una cosa da tenere a mente, però, è che se myValueFromModel è una stringa allora sta per venire attraverso come myFunc(hello) in modo da bisogno di avvolgere questo tra virgolette in modo che diventi myFunc('hello') come questo

myFunc('@(myValueFromModel)'); 

Nota l'extra () utilizzato con il rasoio. Questo aiuta il motore a distinguere dove si trova la pausa tra il codice del rasoio, quindi non succede nulla di strano. Può essere utile quando ci sono nidificati ( o " in giro.

modificare

Se questo sta per essere fatto più volte, quindi alcune modifiche potrebbe essere necessario avere luogo alla fine JavaScript delle cose. Principalmente che l'esempio mostrato non descrive correttamente lo scenario. Dovrà essere modificato. Potresti voler usare una struttura semplice come questa.

jsFiddle Demo

external.js

var myFunc= new function(){ 
var func = this, 
myFunc = function(){ 
    alert(func.value); 
}; 
myFunc.set = function(value){ 
    func.value = value; 
} 
return myFunc; 
}; 

someview.cshtml

<script> 
    myFunc.set('@(myValueFromModel)'); 
    myFunc();//can be called repeatedly now 
</script> 
+0

Grazie! Questo sembra fantastico. Dovrei passare in quel parametro ogni volta che viene chiamata la funzione? Io chiamo questa funzione come 30 volte in tutto il cshtml, quindi dovrei cambiare tutte quelle chiamate o c'è un modo diverso? –

+0

@TalalNabulsi: in questo caso probabilmente vorrai memorizzare la variabile. È possibile memorizzarlo una volta all'interno di un oggetto anziché utilizzare una variabile globale per proteggere lo stato. Si prega di consultare la mia modifica. –

+0

Grazie mille per la modifica di Travis! Questo è esattamente ciò di cui avevo bisogno! –

3

ho spesso che JavaScript nel browser è in genere concettualmente legato ad un elemento specifico. Se questo è il tuo caso, potresti voler associare il valore con quell'elemento nel tuo codice Razor e poi usare JavaScript per estrarre quel valore e usarlo in qualche modo.

Ad esempio:

<div class="my-class" data-func-arg="@myValueFromModel"></div> 

statico JavaScript:

$(function() { 
    $('.my-class').click(function() { 
     var arg = $(this).data('func-arg'); 
     myFunc(arg); 
    }); 
}); 
1

Vuoi eseguire immediatamente la vostra funzione? O vuoi chiamare la funzione con il parametro?

È possibile aggiungere una funzione wrapper senza parametri e all'interno chiamare la propria funzione con la variabile globale come parametro. E quando hai bisogno di chiamare myFunc() lo chiami tramite myFuncWrapper();

function myFuncWrapper(){ 
    myFunc(myValue); 
} 

function myFunc(myParam){ 
//function code here; 
} 
+0

Grazie per l'aspetto che sto cercando. Devo mettere la funzione wrapper nella vista cshtml corretta? –

+0

Per quanto tu possa definire var myValue nel tuo cshtml, sarai in grado di accedere a quella variabile sul tuo file js esterno ... così potresti mettere entrambe le funzioni su jsfile e solo la dichiarazione/assegnazione della variabile su cshtml –

Problemi correlati