2013-01-21 70 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 
} 

這是在視圖模型:

//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遍歷在我的視圖模型對象的列表,請訪問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 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

由於我使用剃鬚刀訪問我的視圖模型,我得到的變量「我」無法找到的錯誤 – Ricardo

1

你可以使用$ .each的jquery迭代結果。

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

我不太熟悉的剃刀語法,但我覺得你還是能理解上面的代碼。