2014-01-27 9 views
13

Ich arbeite an Asp. NET-Mvc-Projekt mit Rasierer.Access-Modell in Javascript asp. NET mvc Rasierer

Ich versuche, mein Modell in Javascript zuzugreifen, als

 
alert(Model.SecurityProfile); 
alert(model.SecurityProfile); 
alert(@Model.SecurityProfile); 
alert(@model.SecurityProfile);

var SecurityProfileViewModel = { ViewModel: model, Id: SecurityProfileId, ProfileId: $('#ProfileId').val(), JobTitleId: $('#JobTitle').val(), SecurityProfileTypeId: $('#SecurityProfileType').val(), Status: $('#ddlStatus').val(), Reason: $('#txtReason').val(), Mode: $('#hidMode').val() };

$.ajax({ 
     url: '/SecurityProfile/Edit', 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: JSON.stringify(SecurityProfileViewModel), 
     success: function (data) { 
      alert(data); 
      window.location.href = '/SecurityProfile/Index'; 

     } 
    }); 

Aber nichts funktioniert folgendermaßen. Ich bekomme Modell ist undefined Fehler

+0

Ich habe das hier im Detail erklärt http://stackoverflow.com/a/41312348/2592042 –

Antwort

40

model ist undefiniert, soweit es JavaScript betrifft. Der serverseitige Code in Ihrer Sicht wird nun serverseitig ausgeführt. JavaScript hat keine Ahnung davon. Es betrifft nur die clientseitige Ausgabe dieses Codes. Sie können Art von mischen Sie die beiden, aber müssen Sie daran denken, dass die serverseitigen Komponenten sind nur da, um Strings ausgeben, die Teil der clientseitigen Ausgabe sein wird.

So zum Beispiel, wenn Sie eine Eigenschaft auf Ihrem Modell genannt:

Model.SomeProperty 

Dann können Sie es nicht direkt wie dies in JavaScript verwenden:

alert(Model.SomeProperty) 
// or 
alert(SomeProperty) 

dass nicht ist mit der Razor-View-Syntax, um der View-Engine mitzuteilen, dass hier serverseitiger Code vorhanden ist. Dies ist syntaktisch clientseitiger Code, und es gibt keine Model Client-Seite. Sie müssen also zeigen, dass es serverseitige Vorverarbeitung zu tun ist:

alert(@Model.SomeProperty) 

Außerdem, wenn SomeProperty ein String ist, dann denken Sie daran, dass es Ausgang ist nicht enthalten werde Anführungszeichen. So müssen Sie auch die für clientseitigen Code zur Verfügung zu stellen:

alert('@Model.SomeProperty') 

Somit ist der serverseitige Wert von SomeProperty wird hier ausgegeben werden, wenn sie an den Client gerendert wird. Also, wenn der Wert etwas wie "Hello World" ist dann würde der resultierende clientseitigen Code sein:

alert('Hello World') 

Die Hauptsache ist daran die Trennung zwischen dem serverseitigen Code und dem clientseitigen Code zu halten. Alles JavaScript/HTML/CSS ist nur eine große Zeichenfolge, was den serverseitigen Code betrifft. Die Ansicht erstellt im Wesentlichen nur eine große Zeichenfolge, die an den Browser gesendet wird. Sobald es im Browser ist, kennt das clientseitige Rendering den Unterschied zwischen JavaScript/HTML/CSS und wird dementsprechend ausgeführt, lange nachdem der serverseitige Code weg ist.

+0

Ich sehe Ihren Standpunkt. Und es funktioniert perfekt. Dank dafür. Wenn ich jetzt das Modell (die Instanz des Objekts) selbst den Daten zuordnen will: Teil des Ajax-Aufrufs, um auf dieselben in den Aktionsmethoden-Parametern des Controllers zuzugreifen, was soll ich tun? – SARAVAN

+0

@SARAVAN: Es ist nicht klar, was du meinst. Ein AJAX-Aufruf ist eine Anfrage/Antwort wie bei jedem Seitenladevorgang. Im Wesentlichen müssen Sie entweder die Daten im Aufruf bereitstellen (z. B. in einem POST, in dem Sie die Felder des Modells vom Client einschließen) oder die Daten des Modells aus der Datenbankpersistenz abrufen (z. B. wenn der POST nur eine ID und das Modell enthält) muss serverseitig basierend nur auf dieser ID aufgebaut werden). – David