ASP.NET MVC 入门5、View与ViewData
本系列文章基于ASP.NET MVC Preview5.
view在MVC模式中與用戶進行最直接的接觸,它負責數據的呈現。這里要注意一點就是,view只是負責數據的呈現,所以我們應該要盡量讓view中不涉及業務邏輯的處理。
我們來添加一個Blog首頁的view。在安裝了ASP.NET MVC后,我們在添加新項目的時候可以看到有MVC的view模板:
?
注:如果你的是中文版的VS,安裝完后可能會出現找不到這個模板的現象,你可以參考在中文版VS 08中安裝MVC這篇文章設置一下。
其中MVC View Content Page是有母版頁的。我們在Views/Home目錄下添加一個MVC View Content Page,并選擇我們Views/Shared目錄下的Site.Master母版頁:
public?partial?class?Index : ViewPage{
}
ASP.NET MVC默認是使用WebForm來作為view的。所以我們看到新建的aspx頁面繼承自ViewPage,如果使用aspx頁面作為ASP.NET MVC的視圖引擎,則所有的aspx頁面都必須繼承自ViewPage。我們再看一下ViewPage:
我們看到ViewPage繼承自ASP.NET WebForm的Page頁,還實現了IViewDataContainer接口,同時還提供了一些Helper類的實例。我們可以使用ViewData來從Controller中往view頁面中傳遞數據。下面我們在HomeController中的Index Action中取出Posts列表,然后在View中顯示。我們先在Controller中取出數據,前面說過,為了方便,我們會直接使用BlogEngine的Model層來作為我們這個4mvcBlog的Model。所以我們的代碼如下:
public?ActionResult Index(int??id){
??? ViewData["Title"]?=?BlogSettings.Instance.Name;?
??? List<IPublishable>?posts?=?BlogEngine.Core.Post.Posts
??????? .ConvertAll(new?Converter<Post, IPublishable>(delegate(Post p) {?return?p?as?IPublishable; }));?
????int?pageIndex?=?(id?!=?null?&&?id.HasValue?&&?id.Value?>?0)???id.Value :?1;
????int?pageSize?=?Math.Min(posts.Count, BlogSettings.Instance.PostsPerPage);
????if?((pageIndex?-?1)?*?pageSize?+?pageSize?>?posts.Count)
??? {
????????return?ShowMsg(new?List<string>() {?"頁碼超出范圍"?});
??? }
??? posts?=?posts.GetRange((pageIndex?-?1)?*?pageSize, pageSize);?
??? ViewData["Posts"]?=?posts;?//向ViewData中傳數據?
????//這里返回View給客戶端,如果不指定要返回的View的名稱,
????//就是返回和Action同名的View,
????//也就是相當于return View("Index");
????return?View();
}
默認的WebFormView搜索View的順序是按如下順序搜索的:
其中{1}為ControllerName,{0}為ActionName。MasterLocationFormats為母版頁的搜索順序。
?
在上面的代碼中我們使用ViewData["Posts"]向View頁面傳遞數據,然后我們就可以在View中取出數據并呈現給用戶,Views/Home/Index.aspx頁面的部分代碼如下:
如上紅色框中的代碼,我們可以從ViewData中取出數據,并轉換為相應的類型。在這里我們發現ViewData要做一個類型的轉換,其實我們可以將ViewData.Model設置為強類型,只需將我們的View頁面繼承自ViewPage<TModel>就可以了:
然后在Controller里面return View()的時候直接給ViewData.Model傳值,如下所示:
然后在View中我們可以直接從強類型的ViewData.Model中取值:
由上面的代碼我看可以看出ViewData.Model就是List<IPublishable>類型,并不需要再進行類型的轉換。
ViewData還有一個Eval的方法,我們可以使用這個方法從ViewData中取值。假如我么在Action中使用return View(Post);給View傳遞一篇日志的數據。而Post有一個Previous的屬性指向前一篇日志,則我們可以在View頁面中可以這樣來取值:
<%=?ViewData.Eval("Previous.Title")%>但是如果使用我最后提供的示例Blog程序的代碼這樣在取值的時候直接在里面使用"."來取值,你會發現取不了值。因為BlogEngine里面的BusinessBase類實現了IDataErrorInfo接口,而IDataErrorInfo有一個索引器,也就是說BusinessBase有一個索引器,就因為有一個索引器,使Eval中不能用點來取值(不知道是不是bug?)。
補充:上面說到的不是Bug,是因為BusinessBase實現了IDataErrorInfo接口,該接口有個索引器,導致ViewData.Eval()方法調用時搜索索引器的值時返回String.Empty而使ViewData.Eval()認為是找到值了,從而失效。
我們可以將return string.Empty修改為return null,這樣就可以了。
好,這一部分就先到這里吧。Enjoy!Post by?Q.Lee.lulu。
本文示例Blog的代碼:4mvcBlog_5.rar
總結
以上是生活随笔為你收集整理的ASP.NET MVC 入门5、View与ViewData的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国经济下滑严重,失业率大涨,为什么美国
- 下一篇: 游戏史上最大收购案再加码!微软为收购动视