2013-01-21 1 views
6

のオブジェクトのリストを反復する方法ビューのモデルにある生徒オブジェクトのリスト内の生徒の名前を取得して、$ .post、後者を使ってサーバーに送信する必要があります私はそれを理解しましたが、オブジェクトのリストを反復する方法を理解できません。Javascript:モデル

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

これは、ビュー内のモデルである:最初のIで

//StudentSearchResult ViewModel 

public class StudentSearchResult { 

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

かかわらあるとしてちょうど学生のリストオブジェクトを送信するが、それはとしては良い考えではないかもしれない基本的に私はこれを持っていますそれはあまりにも多くの属性(私はモデルを送信しようとしたときに私にこの「循環的な」エラーを与えました)とバンドルされています。そして、私はすでに持っている$ .postメソッドを使ってFirstNameとLastNameをコントローラに送る必要があります。私はこれらのようなものを試みた:

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. 

をしかし、私は私の見解モデル内のオブジェクトのリストをJavaScriptで反復処理する方法を、「i」はそれほど存在しないというエラーを取得したい、atributesにアクセスし、それらを連結して、それをコントローラに送信できるように文字列の配列に格納しますか?コントローラがこのように見えると思います。

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

    return View(); 
} 

ありがとう!

+0

確かに 'var length =" @ Model.StudentSearchResult.count() ";' var length = "5"; 'のような結果になりますか?それで文字列ですか?はい、JavaScriptは大雑把に型付けされていますので、ほとんどはうまくいくでしょうが... –

+0

簡単な部分は、ビューモデル内のオブジェクトのリストのメンバーにアクセスして配列に配置することです。 – Ricardo

答えて

21

あなたには無効なjavascriptがあります。あなたがコンパイルC#コード(プロパティ名を欠落していた)を持っているように、あなたのビューモデルを固定することで

まずスタート:

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

その後、あなたのコントローラーアクションと仮定すると、クライアントへのJSONの結果を送信する(これは保証しますビューモデルが適切にJSONをエンコードし、application/jsonレスポンスコンテンツタイプヘッダが送信されるされる):

​​

あなたは簡単に$.each()機能を使用してクライアント上で反復することができます:

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

あるいは無地老いforループあなたが好む場合:

$.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:

私は私はあなたが実行していたことを信じることでミスを犯しているように見えますAJAXリクエスト。代わりに、あなたが必要とするものは、javascriptのモデルプロパティにアクセスすることです。ここでは、これを行うことができる方法は次のとおりです。

@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

あなたの答えをありがとうが、ポスト関数はモデルを返さない、完全なコードを投稿することはできませんが、手元にはありませんでした。 – Ricardo

+1

あなたの$ .eachの例では、投稿からモデルを取っていないが、ビューモデル自体からモデルを取っている場合、配列の要素をどのように紹介するのですか、私はこれを試しています: var names = new Array(); var candidates = "@ Model.Candidates"; //(var i = 0; i Ricardo

+1

私は理解します。あなたがそれを達成する方法の例で、私の更新された答えを見てください。 –

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

代わりの

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

動作するはずです。

+1

私は剃刀を使って私のビューモデルにアクセスしているので、変数 "i"が見つからないというエラーが出る – Ricardo

1

あなたは結果を反復するためにjqueryのの$ .eachを使用することができます。

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

となっています。あなたはループ変数の宣言で間違いました

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

JSONとしてクライアントに出力するのが必要ですか?これを試してみてください:

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

私はRazorの構文に慣れていませんが、上記のコードを理解できると思います。

関連する問題