10

そのため、ビューのモデルにある学生オブジェクトのリストで学生の名前を取得し、$.post を介してサーバーに送信する必要があります。後者は理解しましたが、方法がわかりませんオブジェクトのリストを反復します。基本的に私はこれを持っています:

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

ビュー内のモデルは次のとおりです。

//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.

しかし、「i」が存在しないというエラーが表示されるので、ビュー モデル内のオブジェクトのリストを JavaScript で反復処理し、属性にアクセスしてそれらを連結し、それらを文字列の配列に格納して、コントローラーに送ってもいいですか?コントローラーはこんな感じになると思います

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

  return View();
}

ありがとう!

4

4 に答える 4

31

あそこに無効な JavaScript があります。

まず、ビュー モデルを修正して、C# コードをコンパイルできるようにします (プロパティ名がありませんでした)。

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

次に、コントローラー アクションが JSON 結果をクライアントに送信すると仮定します (これにより、ビュー モデルが適切に JSON エンコードされ、application/json応答コンテンツ タイプ ヘッダーが送信されることが保証されます)。

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

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

アップデート:

あなたが 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>
于 2013-01-21T06:34:32.397 に答える
1

$.each の jquery を使用して、結果を繰り返すことができます。

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

そしてエラーのために。ループ変数の宣言を間違えました

for (var i = 0; i < length; i++) 
于 2013-01-21T06:34:40.160 に答える
1

ユーザー名を JSON としてクライアントに出力する必要があるように見えますか? これを試して:

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

私は Razor の構文にはあまり詳しくありませんが、上記のコードは理解できると思います。

于 2013-01-21T06:34:57.703 に答える
0
for (var i = 0; i < length; i++) 

それ以外の

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

動作するはずです。

于 2013-01-21T06:34:13.670 に答える