2013年4月11日 星期四

ASP.NET MVC ViewModel List回傳值為Null


因系統功能需要一個View使用到多個Model來完成資料的呈現,
研究了ASP.NET MVC中的ViewModel使用方式並將其實作,
但在實作過程中卻發生了Model類別為List類型的回傳值一直為null,


ViewModel程式碼舉例如下:

檔案內會看到底下三行預設值:
  1. public class ScoreViewModel
  2.  
  3. {
  4.  
  5. public string subject { get; set; }
  6.  
  7. public string score { get; set; }
  8.  
  9. public int count{ get; set; }
  10.  
  11. public List<StudentM> stdList { get; set; }
  12.  
  13. }
  14.  
在View中則是透過強型別以foreach方式將stdList依序取出

  1. <% foreach (var item in Model.stdList ) { %>
  2.  
  3. <%:Html.EditorFor(model => item.name)%>
  4.  
  5. <%:Html.EditorFor(model => item.id)%>
  6.  
  7. } %>

但Post後stdList卻總是回傳空值,在中文資料缺乏的情況下,
透過viewmodel null關鍵字看了一堆英文資料,
才知道原來透過上述方式顯示後所產生的input name無法與Model name對應,
正常html顯示應為:
  1. <input name="stdList[0].name"  type="text"></input>
  2.  
  3. <input name="stdList[0].id" type="text"></input>
  4.  

但前述foreach程式碼所產生的input name如下:
  1. <input name="item.name" type="text"></input>
  2.  
  3. <input name="item.id" type="text"></input>
  4.  

這即是造成Post後stdList一直為空的原因,
因此在ViewModel中如果有用到List或IEnumerable類型的Model類別時,
在View Page取值若使用foreach的話需加上個count計數,或改用for loop方式取值
  1. <% int count=0;
  2.  
  3. foreach (var item in Model.stdList ){ %>
  4.  
  5. <%:Html.EditorFor(model => Model.stdList [count].name)%>
  6.  
  7. <%:Html.EditorFor(model => Model.stdList [count].id)%>
  8.  
  9. <% count++;
  10. }%>
  11.  
這樣Post後才能正確回傳stdList的值,而不是null。

沒有留言:

張貼留言

Android Audio 心得筆記(一):Audio Stream類型與預設音量

因為一些工作關係所以接觸到Android上層Audio Framework與Volume相關的部分, 記錄一下這一段時間追Code的心得,這邊會以Google N的Code為參考. Android Audio總共定義10種STREAM類型(不含DEFAULT), 用途都蠻...