2013-01-21 30 views
6

vì vậy tôi cần tìm nạp tên các sinh viên trong danh sách đối tượng sinh viên trong mô hình của khung nhìn sau đó gửi chúng đến máy chủ qua $ .post, Tôi đã tìm ra nó nhưng tôi không thể tìm ra cách lặp qua danh sách các đối tượng. Về cơ bản tôi có điều này:Javascript: Làm thế nào để lặp qua danh sách các đối tượng trong Model

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

Đây là mô hình trong giao diện:

//StudentSearchResult ViewModel 

public class StudentSearchResult { 

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

Lúc đầu, tôi mặc dù chỉ gửi các đối tượng danh sách học sinh như là, nhưng nó có thể không phải là một ý tưởng tốt như nó được đóng gói với quá nhiều thuộc tính (nó đã cho tôi lỗi 'tròn' này khi tôi cố gắng gửi mô hình) và tôi chỉ thực sự cần gửi FirstName và LastName được nối vào bộ điều khiển bằng phương thức $ .post mà tôi đã có. Tôi cố gắng điều như thế này:

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. 

Nhưng tôi muốn nhận được một lỗi mà "i" không tồn tại như vậy, làm sao tôi có thể lặp trong javascript qua danh sách các đối tượng trong mô hình quan điểm của tôi, truy cập vào atributes và nối chúng và sau đó lưu trữ chúng trên một chuỗi các chuỗi để tôi có thể gửi nó đến bộ điều khiển? Tôi tưởng tượng bộ điều khiển sẽ trông như thế này

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

    return View(); 
} 

Cảm ơn!

+0

Chắc chắn 'var length =" @ Model.StudentSearchResult.count() ";' dẫn đến một cái gì đó như 'var length =" 5 ";' đi tới client? Và do đó là một chuỗi? Có, JavaScript được đánh máy lỏng lẻo và vì vậy nó hầu như sẽ hoạt động, nhưng ... –

+0

Thats phần dễ dàng, những gì tôi không thể làm là truy cập vào các thành viên của danh sách các đối tượng trong mô hình khung nhìn và đặt chúng trên một mảng – Ricardo

Trả lời

21

Bạn có một số javascript không hợp lệ ở đó.

Đầu tiên bắt đầu bằng cách sửa chữa mô hình điểm của bạn để bạn có một biên dịch C# code (bạn bị mất tích một tên sở hữu):

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

Sau đó, giả định các hành động điều khiển của bạn sẽ gửi một kết quả JSON cho khách hàng (điều này đảm bảo rằng mô hình xem được đúng JSON mã hóa và rằng application/json phản ứng tiêu đề kiểu nội dung được gửi):

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

bạn có thể dễ dàng lặp trên máy khách bằng cách sử dụng chức năng $.each():

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

hoặc thậm chí một ol đồng bằng' for vòng lặp nếu bạn thích:

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

Dường như tôi có, tôi đã phạm sai lầm bằng cách tin rằng bạn đang thực hiện một Yêu cầu AJAX. Thay vào đó, những gì bạn cần là truy cập các thuộc tính mô hình trong javascript. Dưới đây là cách thực hiện điều này:

@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

Cảm ơn bạn đã trả lời nhưng chức năng đăng không trả về mô hình, tôi biết điều này là vì tôi đã không làm như vậy t gửi mã hoàn chỉnh nhưng tôi không có nó trong tầm tay. – Ricardo

+1

Trong ví dụ $ .each của bạn, bạn sẽ giới thiệu các phần tử trong mảng như thế nào nếu bạn không lấy mô hình từ bài đăng nhưng từ chính mô hình khung nhìn, tôi đang cố gắng: var names = new Array(); var ứng cử viên = "@ Model.Candidates"; // Nó không cho phép tôi làm điều này cho (var i = 0; i <ứng cử viên.length; i ++) {var ứng cử viên = ứng cử viên [i]; thông báo ('FirstName:' + candidate.Name + 'LastName:' + candidate.LastName); } Tất cả những gì tôi cần là điền một mảng có họ và tên – Ricardo

+1

Tôi hiểu. Vui lòng xem câu trả lời cập nhật của tôi với ví dụ về cách bạn có thể đạt được điều đó. –

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

thay vì

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

nên làm việc.

+1

Vì tôi đang sử dụng dao cạo để truy cập vào mô hình xem của mình, tôi nhận được lỗi rằng biến "i" không thể tìm thấy – Ricardo

1

bạn có thể sử dụng $ .each of jquery để lặp lại kết quả.

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

và do lỗi.bạn đã phạm sai lầm khi khai báo biến vòng lặp

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

Có vẻ như những gì bạn cần là xuất tên người dùng cho máy khách dưới dạng JSON? Hãy thử điều này:

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

Tôi không quen thuộc với cú pháp Razor, nhưng tôi nghĩ bạn vẫn có thể hiểu mã ở trên.

Các vấn đề liên quan