Javascript: comment itérer à travers la liste des objets dans le modèle

alors je dois aller chercher les noms des étudiants dans une liste d'objets étudiants qui est dans le modèle d'une vue puis les envoyer au serveur via $.poste, celle-ci je l'ai compris mais je ne peux pas comprendre comment parcourir la liste des objets. Fondamentalement, j'ai ceci:

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

C'est le modèle dans la vue:

//StudentSearchResult ViewModel

public class StudentSearchResult {

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

au début j'ai pensé à envoyer simplement l'objet de la liste des étudiants tel quel, mais ce n'est peut-être pas une bonne idée car il est empaqueté avec trop d'attributs (il m'a donné cette erreur "circulaire" quand j'ai essayé d'envoyer le model) et je n'ai vraiment besoin que d'envoyer le prénom concaténé et le nom de LastName au controller en utilisant le $.post méthode que j'ai déjà. J'ai essayé des choses comme celles-ci:

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.

mais j'obtiendrais une erreur que "i" n'existe pas ainsi, comment puis-je itérer en javascript à travers la liste des objets dans mon modèle de vue, accéder aux attributs et les concaténer et ensuite les stocker sur un tableau de chaînes de sorte que je puisse l'Envoyer à la contrôleur? J'imagine que le contrôleur devrait ressembler à ceci

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

  return View();
}

Merci!

8
demandé sur Ricardo 2013-01-21 10:30:22

4 réponses

Vous avez quelques invalide javascript.

commencez par corriger votre modèle de vue pour que vous ayez un code de compilation C# (il vous manquait un nom de propriété):

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

alors en supposant que les actions de votre controller envoient un résultat JSON au client (cela garantit que le modèle de vue est correctement encodé JSON et que le application/json type de contenu de la réponse l'en-tête est envoyé):

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

vous pouvez facilement itérer sur le client en utilisant le $.each() fonction:

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

ou même une plaine ol' for boucle si vous préférez:

$.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);
    }
});

mise à jour:

il semble que j'ai fait une erreur en croyant que vous exécutiez une requête AJAX. Au lieu de cela, ce dont vous avez besoin est d'accéder aux propriétés du modèle dans javascript. Voici comment cela pourrait être fait:

@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>
23
répondu Darin Dimitrov 2013-01-21 21:27:04
for (var i = 0; i < length; i++) 

au lieu de

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

ça devrait marcher.

1
répondu ndlinh 2013-01-21 06:34:13

vous pouvez utiliser $.chacun de jquery pour itérer le résultat.

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

et pour l'erreur. vous avez fait une erreur dans la déclaration de la variable boucle

for (var i = 0; i < length; i++) 
1
répondu Ravi Gadag 2013-01-21 06:34:40

on dirait que ce dont vous avez besoin est de sortir les noms d'utilisateur au client comme JSON? Essayez ceci:

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

Je ne suis pas tout à fait familier avec la syntaxe du rasoir, mais je pense que vous pouvez encore comprendre le code ci-dessus.

1
répondu Jeffrey Zhao 2013-01-21 06:34:57