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如果您愿意,甚至可以使用普通的 ol'循环:

$.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 回答