Inhalt der Antwort
1) Zugriff auf Modelldaten im Javascript / Jquery-Codeblock in der .cshtml
Datei
2) Zugriff auf Modelldaten im Javascript / Jquery-Codeblock in der .js
Datei
Zugriff auf Modelldaten im Javascript / Jquery-Codeblock in der .cshtml
Datei
Es gibt zwei Arten von Model
Zuweisungen von c # -Variablen ( ) zu JavaScript-Variablen.
- Objektzuordnung - Grunddatentypen wie
int
, string
, DateTime
(zB: Model.Name
)
- Objektzuweisung - Benutzerdefinierte oder integrierte Klassen (Beispiel :
Model
, Model.UserSettingsObj
)
Schauen wir uns die Details dieser beiden Aufgaben an.
Für den Rest der Antwort betrachten wir das folgende AppUser
Modell als Beispiel.
public class AppUser
{
public string Name { get; set; }
public bool IsAuthenticated { get; set; }
public DateTime LoginDateTime { get; set; }
public int Age { get; set; }
public string UserIconHTML { get; set; }
}
Und die Werte, die wir diesem Modell zuweisen, sind
AppUser appUser = new AppUser
{
Name = "Raj",
IsAuthenticated = true,
LoginDateTime = DateTime.Now,
Age = 26,
UserIconHTML = "<i class='fa fa-users'></i>"
};
Eigentumszuweisung
Verwenden wir eine andere Syntax für die Zuweisung und beobachten Sie die Ergebnisse.
1) Ohne die Zuweisung von Eigenschaften in Anführungszeichen zu setzen.
var Name = @Model.Name;
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime;
var IsAuthenticated = @Model.IsAuthenticated;
var IconHtml = @Model.UserIconHTML;
Wie Sie es gibt einige Fehler sehen können, Raj
und True
wird als JavaScript - Variablen sein und da sie ihren einen nicht existieren variable undefined
Fehler. Wenn bei der Datumsangabe varialble der Fehler darin besteht, dass unexpected number
Zahlen keine Sonderzeichen enthalten dürfen, werden die HTML-Tags in ihre Entitätsnamen konvertiert, damit der Browser Ihre Werte und das HTML-Markup nicht verwechselt.
2) Umschließen der Zuweisung von Eigenschaften in Anführungszeichen.
var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML';
Die Ergebnisse sind gültig. Wenn Sie also die Eigenschaftszuweisung in Anführungszeichen setzen, erhalten Sie eine gültige Syntax. Beachten Sie jedoch, dass die Zahl Age
jetzt eine Zeichenfolge ist. Wenn Sie also nicht möchten, dass wir die Anführungszeichen entfernen können, wird sie als Zahlentyp gerendert.
3) Verwenden, @Html.Raw
aber ohne es in Anführungszeichen zu setzen
var Name = @Html.Raw(Model.Name);
var Age = @Html.Raw(Model.Age);
var LoginTime = @Html.Raw(Model.LoginDateTime);
var IsAuthenticated = @Html.Raw(Model.IsAuthenticated);
var IconHtml = @Html.Raw(Model.UserIconHTML);
Die Ergebnisse ähneln unserem Testfall 1. Die Verwendung @Html.Raw()
der HTML
Zeichenfolge hat jedoch einige Änderungen gezeigt. Der HTML-Code wird beibehalten, ohne dass die Entitätsnamen geändert werden.
Aus den Dokumenten Html.Raw ()
Umschließt das HTML-Markup mit einer HtmlString-Instanz, sodass es als HTML-Markup interpretiert wird.
Trotzdem haben wir Fehler in anderen Zeilen.
4) Verwenden @Html.Raw
und auch in Anführungszeichen setzen
var Name ='@Html.Raw(Model.Name)';
var Age = '@Html.Raw(Model.Age)';
var LoginTime = '@Html.Raw(Model.LoginDateTime)';
var IsAuthenticated = '@Html.Raw(Model.IsAuthenticated)';
var IconHtml = '@Html.Raw(Model.UserIconHTML)';
Die Ergebnisse sind bei allen Typen gut. Aber unsere HTML
Daten sind jetzt kaputt und dies wird die Skripte kaputt machen. Das Problem ist, dass wir einfache Anführungszeichen verwenden '
, um die Daten zu verpacken, und sogar die Daten einfache Anführungszeichen haben.
Wir können dieses Problem mit zwei Ansätzen lösen.
1) Verwenden Sie doppelte Anführungszeichen " "
, um den HTML-Teil zu verpacken. Da die inneren Daten nur einfache Anführungszeichen haben. (Stellen Sie sicher, dass nach dem Umschließen mit doppelten Anführungszeichen auch keine "
Daten enthalten sind.)
var IconHtml = "@Html.Raw(Model.UserIconHTML)";
2) Entfliehen Sie der Zeichenbedeutung in Ihrem serverseitigen Code. Mögen
UserIconHTML = "<i class=\"fa fa-users\"></i>"
Abschluss der Immobilienvergabe
- Verwenden Sie Anführungszeichen für nicht numerische Datentypen.
- Verwenden Sie keine Anführungszeichen für numerische Datentypen.
- Verwenden
Html.Raw
Sie diese Option, um Ihre HTML-Daten so zu interpretieren, wie sie sind.
- Achten Sie auf Ihre HTML-Daten, um entweder die Anführungszeichen auf der Serverseite zu umgehen, oder verwenden Sie bei der Zuweisung zur Javascript-Variablen ein anderes Anführungszeichen als in Daten.
Objektzuordnung
Verwenden wir eine andere Syntax für die Zuweisung und beobachten Sie die Ergebnisse.
1) Ohne die Objektzuweisung in Anführungszeichen zu setzen.
var userObj = @Model;
Wenn Sie der Javascript-Variablen ein ac # -Objekt zuweisen, wird der Wert des .ToString()
Objekts zugewiesen. Daher das obige Ergebnis.
2 Umschließen der Objektzuweisung in Anführungszeichen
var userObj = '@Model';
3) Verwenden Html.Raw
ohne Anführungszeichen.
var userObj = @Html.Raw(Model);
4) Verwenden Sie Html.Raw
zusammen mit Anführungszeichen
var userObj = '@Html.Raw(Model)';
Das hat Html.Raw
uns beim Zuweisen eines Objekts zur Variablen wenig geholfen.
5) Verwenden Json.Encode()
ohne Anführungszeichen
var userObj = @Json.Encode(Model);
//result is like
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482572875150)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
Wir sehen einige Veränderungen. Wir sehen, dass unser Modell als Objekt interpretiert wird. Aber wir haben diese Sonderzeichen geändert entity names
. Auch das Umschließen der obigen Syntax in Anführungszeichen nützt wenig. Wir erhalten einfach das gleiche Ergebnis in Anführungszeichen.
Aus den Dokumenten von Json.Encode ()
Konvertiert ein Datenobjekt in eine Zeichenfolge im JSON-Format (JavaScript Object Notation).
Da Sie dieses entity Name
Problem bereits bei der Zuweisung von Eigenschaften festgestellt haben und wenn Sie sich erinnern, haben wir es mit der Verwendung von überwunden Html.Raw
. Probieren wir das aus. Lasst uns kombinieren Html.Raw
undJson.Encode
6) Verwenden Html.Raw
und Json.Encode
ohne Anführungszeichen.
var userObj = @Html.Raw(Json.Encode(Model));
Ergebnis ist ein gültiges Javascript-Objekt
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482573224421)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
7) Verwenden Html.Raw
und Json.Encode
innerhalb von Anführungszeichen.
var userObj = '@Html.Raw(Json.Encode(Model))';
Wie Sie sehen, erhalten Sie beim Umschließen mit Anführungszeichen JSON-Daten
Schlussfolgerung zur Objektzuordnung
- Verwenden Sie
Html.Raw
und Json.Encode
in Kombination, um Ihr Objekt der Javascript-Variablen als JavaScript-Objekt zuzuweisen .
- Verwenden Sie
Html.Raw
und Json.Encode
wickeln Sie es auch ein quotes
, um einen JSON zu erhalten
Hinweis: Wenn Sie festgestellt haben, dass das DataTime-Datenformat nicht richtig ist. Dies liegt daran, dass Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
JSON wie bereits erwähnt keinen date
Typ enthält. Weitere Optionen, um dies zu beheben, sind das Hinzufügen einer weiteren Codezeile, um diesen Typ allein mit dem Objekt javascipt Date () zu behandeln
var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)');
//without Json.Encode
Zugriff auf Modelldaten im Javascript / Jquery-Codeblock in der .js
Datei
Die Rasierersyntax hat in der .js
Datei keine Bedeutung und daher können wir unser Modell nicht direkt in einer .js
Datei verwenden. Es gibt jedoch eine Problemumgehung.
1) Die Lösung verwendet globale Javascript-Variablen .
Wir müssen den Wert einer Javascipt-Variablen mit globalem Gültigkeitsbereich zuweisen und diese Variable dann in allen Codeblöcken Ihrer .cshtml
und Ihrer .js
Dateien verwenden. Die Syntax wäre also
<script type="text/javascript">
var userObj = @Html.Raw(Json.Encode(Model)); //For javascript object
var userJsonObj = '@Html.Raw(Json.Encode(Model))'; //For json data
</script>
In diesem Ort können wir die Variablen verwenden , userObj
und userJsonObj
wie und wann erforderlich.
Hinweis: Ich persönlich empfehle nicht, globale Variablen zu verwenden, da die Wartung sehr schwierig wird. Wenn Sie jedoch keine andere Option haben, können Sie sie mit einer geeigneten Namenskonvention verwenden userAppDetails_global
.
2) Verwenden Sie function () oder closure
Wrap den gesamten Code, der von den Modelldaten in einer Funktion abhängig ist. Führen Sie diese Funktion dann aus der .cshtml
Datei aus.
external.js
function userDataDependent(userObj){
//.... related code
}
.cshtml
Datei
<script type="text/javascript">
userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function
</script>
Hinweis: Auf Ihre externe Datei muss vor dem obigen Skript verwiesen werden. Sonst ist die userDataDependent
Funktion undefiniert.
Beachten Sie auch, dass die Funktion auch im globalen Bereich sein muss. Bei beiden Lösungen müssen wir uns also mit globalen Akteuren befassen.