2015-08-06 3 views
5

Wie Sie vielleicht wissen, funktioniert Razorsyntax in ASP.NET MVC nicht in externen JavaScript-Dateien.Razorsyntax in externem JavaScript

Meine aktuelle Lösung besteht darin, die Razorsyntax in eine globale Variable zu setzen und den Wert dieser Variablen aus der MVC-Ansicht zu setzen, die diese .js-Datei verwendet.

JavaScript-Datei:

function myFunc() { 
    alert(myValue); 
} 

MVC View file:

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

Ich möchte wissen, wie ich myValue direkt als Parameter an die Funktion übergeben können? Ich bevorzuge explizite Aufrufe mit param, anstatt mich auf globale Variablen zu verlassen, allerdings bin ich nicht so scharf auf Javascript.

Wie würde ich dies mit JavaScript-Parametern implementieren? Vielen Dank!

Antwort

7

Lassen Sie einfach Ihre Funktion ein Argument akzeptieren und verwenden Sie dies in der Warnung (oder wo auch immer).

external.js

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

someview.cshtml

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

Eine Sache, obwohl im Auge zu behalten, ist, dass, wenn myValueFromModel eine Zeichenfolge ist, dann wird es als myFunc(hello) so durch kommen gehen Sie Sie müssen das in Anführungszeichen setzen, damit es myFunc('hello') wie dieses

myFunc('@(myValueFromModel)'); 
wird 210

Beachten Sie die zusätzlichen () mit Rasierer verwendet. Dies hilft dem Motor zu unterscheiden, wo die Pause zwischen dem Rasierercode ist, so dass nichts Ungewöhnliches passiert. Es kann nützlich sein, wenn verschachtelte ( oder " herum sind.

bearbeiten

Wenn dies mehrmals getan werden soll, dann müssen einige Änderungen können in dem JavaScript-Ende der Dinge nehmen. Hauptsächlich, dass das gezeigte Beispiel das Szenario nicht richtig abbildet. Es muss geändert werden. Vielleicht möchten Sie eine einfache Struktur wie diese verwenden.

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

Vielen Dank! Das sieht gut aus. Müsste ich bei jedem Aufruf der Funktion diesen Parameter übergeben? Ich rufe diese Funktion wie 30 Mal im gesamten cshtml, also müsste ich alle diese Anrufe ändern oder gibt es einen anderen Weg? –

+0

@TalalNabulsi - In diesem Fall werden Sie wahrscheinlich die Variable speichern wollen. Es ist möglich, sie einmal innerhalb eines Objekts zu speichern, anstatt eine globale Variable zu verwenden, um den Status zu schützen. Bitte sehen Sie meine Bearbeitung. –

+0

Vielen Dank für die Bearbeitung Travis! Genau das habe ich gebraucht! –

3

ich oft fest, dass JavaScript im Browser konzeptionell auf ein bestimmtes Element gebunden ist in der Regel. Wenn dies für Sie der Fall ist, können Sie den Wert mit diesem Element in Ihrem Razor-Code verknüpfen und dann mithilfe von JavaScript diesen Wert extrahieren und auf irgendeine Weise verwenden.

Zum Beispiel:

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

Static JavaScript:

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

Haben Sie Ihre Funktion sofort ausführen möchten? Oder möchten Sie die Funktion mit dem Parameter aufrufen?

Sie könnten eine Wrapper-Funktion ohne Parameter hinzufügen und innerhalb rufen Sie Ihre Funktion mit der globalen Variablen als Parameter auf. Und wenn Sie myFunc() aufrufen müssen, nennen Sie es myFuncWrapper();

function myFuncWrapper(){ 
    myFunc(myValue); 
} 

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

Danke das sieht aus wie ich suche. Ich muss die Wrapper-Funktion in der cshtml-Ansicht richtig stellen? –

+0

Soweit Sie Ihren var myValue in Ihrem cshtml definieren, können Sie auf diese Variable in Ihrer externen js-Datei zugreifen ... also könnten Sie beide Funktionen auf die jsfile und nur die Variablendeklaration/-zuweisung auf cshtml setzen –

Verwandte Themen