2013年4月11日 星期四

ASP.NET MVC ViewModel List回傳值為Null


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


ViewModel程式碼舉例如下:

檔案內會看到底下三行預設值:
public class ScoreViewModel
{
public string subject { get; set; }
public string score { get; set; }
public int count{ get; set; }
public List<StudentM> stdList { get; set; }
}
在View中則是透過強型別以foreach方式將stdList依序取出

<% foreach (var item in Model.stdList ) { %>
<%:Html.EditorFor(model => item.name)%>
<%:Html.EditorFor(model => item.id)%>
} %>

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

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

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

沒有留言:

張貼留言

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

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