2013-01-21 7 views
6

iteriert, also muss ich holen, um die Namen der Kursteilnehmer in einer Liste des Kursteilnehmerobjektes zu holen, das im Modell einer Ansicht ist, dann sendete sie zum Server über $ .post, letzteres Ich habe es herausgefunden, aber ich kann nicht herausfinden, wie ich die Liste der Objekte durchlaufen soll. Im Prinzip habe ich dies:Javascript: Wie man durch Liste der Gegenstände im Modell

//Student object 
public class Student 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    //Like a bunch of other attributes here 
} 

Dies ist das Modell in der Ansicht:

//StudentSearchResult ViewModel 

public class StudentSearchResult { 

    public IEnumerable<Student> { get; set;} 
} 

Zuerst dachte ich, nur die Schüler Liste Objekt sendet wie es ist, aber es kann nicht eine gute Idee sein, wie Es ist mit zu vielen Attributen gebündelt (es gab mir diesen "zirkulären" Fehler, als ich versuchte, das Modell zu senden) und ich muss nur die verketteten FirstName und LastName mit der $ .post-Methode, die ich bereits habe, an den Controller senden. Ich habe versucht, Dinge wie diese:

var names = [] 
var length = "@Model.StudentSearchResult.count()"; 
for (int i = 0; i < length; i++) 
{ 
    names[] = "@Model.StudentSearchResult[i].Name + @Model.StudentSearchResult[i].LastName" 
} 
//$.post function here that calls the controller and send the concatenated names of each student in studentsearchresult. 

Aber ich würde einen Fehler, dass „i“ existiert nicht so, wie kann ich in Javascript, um durch die Liste der Objekte in meiner Ansicht nach Modell iterieren, Zugriff auf die atributes und verketten sie und speichern sie dann auf einem Array von Zeichenfolgen, so dass ich es an den Controller senden kann? Ich stelle mir vor, der Controller würde so aussehen

[HttpPost] 
public ActionResult StudentSearchResult(/*other stuff I send here, */ string[] studentNames){ 
    //stuff here 

    return View(); 
} 

Vielen Dank!

+0

Sicher 'var length =" @ Model.StudentSearchResult.count() ";' führt zu etwas wie 'var length =" 5 ";' zum Client gehen? Und so eine Schnur zu sein? Ja, JavaScript ist locker getippt und so wird es meistens funktionieren, aber ... –

+0

Das ist der einfache Teil, was ich nicht tun kann, ist auf die Mitglieder der Liste der Objekte im Ansichtsmodell zuzugreifen und sie auf ein Array – Ricardo

Antwort

21

Sie haben einige ungültige Javascript drüben.

Erster Start nach Ihrer Ansicht nach Modell Fixierung, so dass Sie eine Zusammenstellung von C# -Code haben (Sie einen Eigenschaftsnamen fehlten):

public class StudentSearchResult 
{ 
    public IEnumerable<Student> Students { get; set;} 
} 

Dann wird Ihr Controller-Aktionen unter der Annahme, sendet ein JSON Ergebnis an den Client (dies stellt sicher, dass das view-Modell richtig codiert JSON und dass die application/json Response-Header Content-Typ gesendet wird):

[HttpPost] 
public ActionResult StudentSearchResult(/*other stuff I send here, */ string[] studentNames) 
{ 
    StudentSearchResult model = ... //stuff here to populate your view model 
    return Json(model); 
} 

Sie einfach auf dem Client mit Hilfe der $.each() Funktion iterieren könnte:

var studentNames = ['name1', 'name2']; 
$.post('/Students/StudentSearchResult', studentNames, function(result) { 
    var students = result.Students; 
    $.each(students, function() { 
     alert('FirstName: ' + this.FirstName + ' LastName:' + this.LastName); 
    }); 
}); 

oder sogar ein einfaches ol for Schleife wenn Sie es vorziehen:

$.post('/Students/StudentSearchResult', studentNames, function(result) { 
    var students = result.Students; 
    for (var i = 0; i < students.length; i++) { 
     var student = students[i]; 
     alert('FirstName: ' + student.FirstName + ' LastName:' + student.LastName); 
    } 
}); 

UPDATE:

Es sieht aus wie ich, ich habe zu glauben, einen Fehler gemacht, dass Sie eine Durchführung wurden AJAX-Anfrage. Stattdessen müssen Sie auf die Modelleigenschaften in JavaScript zugreifen. Hier ist, wie dies getan werden könnte:

@model StudentSearchResult 
<script type="text/javascript"> 
    var students = @Html.Raw(Json.Encode(Model.Students)); 
    // students is a javascript array that will look like this: 
    // students = [{"FirstName":"fn1","LastName":"ln1"}, {"FirstName":"fn2","LastName":"ln2"}, ...]; 
    for (var i = 0; i < students.length; i++) { 
     var student = students[i]; 
     alert('FirstName: ' + student.FirstName + ' LastName:' + student.LastName); 
    } 
</script> 
+0

Danke für Ihre Antwort, aber die Pfostenfunktion gibt kein Modell zurück, ich weiß, dass das ist, weil ich didn ' Ich poste den kompletten Code, aber ich hatte ihn nicht zur Hand. – Ricardo

+1

Wie würden Sie in Ihrem $ .each-Beispiel die Elemente in einem Array einführen, wenn Sie das Modell nicht aus dem Post, sondern aus dem Ansichtsmodell selbst herausholen? var names = new Array(); var kandidaten = "@ Model.Candidates"; // Es lässt mich das nicht machen für (var i = 0; i Ricardo

+1

zu füllen Ich verstehe. Bitte sehen Sie meine aktualisierte Antwort mit einem Beispiel, wie Sie das erreichen könnten. –

1
for (var i = 0; i < length; i++) 

statt

for (int i = 0; i < length; i++) 

sollte funktionieren.

+1

zu setzen Da ich Rasierapparat verwende, um auf mein Ansichtsmodell zuzugreifen, bekomme ich den Fehler, dass die Variable "ich" nicht gefunden werden kann – Ricardo

1

können Sie $ .Each von jquery verwenden, um das Ergebnis zu iterieren.

$.each(yourModel,function(){//do with loop}); 

und für den Fehler.Sie haben einen Fehler bei der Deklaration der Schleifenvariable

for (var i = 0; i < length; i++) 
1

Sieht aus, wie Sie die Benutzernamen an den Client als JSON ausgeben müssen? Versuchen Sie folgendes:

var names = @Model.StudentSearchResult.Select(s => new { s.FirstName, s.LastName }).ToList(); 

Ich bin nicht ganz vertraut mit der Razor-Syntax, aber ich denke, Sie immer noch den oben stehenden Code verstehen können.

Verwandte Themen