MVC中的ViewData
View在MVC模式中與使用者進行最直接的接觸,負責資料的呈現。注意:view只是負責資料的呈現,我們要盡量讓view中不涉及商務邏輯的處理。既然View與後台代碼是相分離的,但View和Controller是如何聯絡在一起的呢,答案就是ViewData。
ASP.NET MVC預設使用WebForm來作為view。建立的aspx頁面繼承自ViewPage,所有的aspx頁面都必須繼承自ViewPage。我們再看一下ViewPage的部分代碼:
public class ViewPage : Page, IViewDataContainer
我們使用傳統的asp.net開發時,經常會為了開發的需要,會寫一個類似PageBase類,例如會把部分比較通用的方法寫入基類。同樣在MVC中,我們也可以這樣做。
第一:建立一個ViewPage<T>類:這個類主要是完成一個繼承功能,對MvcContrib.FluentHtml.ModelViewPage,MvcContrib.FluentHtml.ModelViewUserControl的繼承,實現System.Web.Mvc.ViewPage的功能。還有一個非常重要的作用就是把所有的擴充方法都體現在這個類中。類中using GuestBook.Common.HtmlHelpers;可以說明。
using GuestBook.Common.HtmlHelpers;
namespace GuestBook.Web
{
public class ViewPage<T> : MvcContrib.FluentHtml.ModelViewPage<T> where T : class
{
public ViewPage()
{
}
}
public class ViewUserControl<T> : MvcContrib.FluentHtml.ModelViewUserControl<T> where T : class
{
public ViewUserControl()
{
}
}
}
第二:對MVC進行擴充。例如對Html的擴充,我們在做增刪改查類似操作時,當使用者提交後一般都會根據系統處理結果顯示一段提示文字給使用者。
1:建立擴充類:HtmlHelperExtensions,主要包含兩個方法,一個是操作成功後的處理方法,另一個則是失敗後的處理結果。
public static class HtmlHelperExtensions
{
public static string ErrorBox(this HtmlHelper htmlHelper, ViewDataBase errorViewData)
{
if (errorViewData.ErrorMessage == null) return string.Empty;
HtmlTextWriter writer = new HtmlTextWriter(new StringWriter());
writer.AddAttribute("class", "error");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.Write(errorViewData.ErrorMessage);
writer.RenderEndTag();
return writer.InnerWriter.ToString();
}
public static string MessageBox(this HtmlHelper htmlHelper, ViewDataBase messageViewData)
{
if (messageViewData.Message == null) return string.Empty;
HtmlTextWriter writer = new HtmlTextWriter(new StringWriter());
writer.AddAttribute("class", "message");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
writer.Write(messageViewData.Message);
writer.RenderEndTag();
return writer.InnerWriter.ToString();
}
}
2:我們看到上面代碼中有一個類:ViewDataBase,這個類是所有ViewData的基類,裡面主要包含兩個欄位:1,一般提示內容;2,當發生異常時的提示內容。
public class ViewDataBase
{
public string Message { get; set; }
public string ErrorMessage { get; set; }
public ViewDataBase WithErrorMessage(string errorMessage)
{
this.ErrorMessage = errorMessage;
return this;
}
public ViewDataBase WithMessage(string message)
{
this.Message = message;
return this;
}
}
說明:我們在留言所使用的ViewData類需要繼承ViewDataBase
public class GuestBookInfo : ViewDataBase
{
public string sTitle
{ get; set; }
public string sContent
{ get; set; }
public int ID
{ get; set; }
}
3:在View中調用擴充方法:
1>:頁面引用代碼的更改:
預設的:Inherits="System.Web.Mvc.ViewPage<GuestBook.Common .Models.GuestBookInfo>"
擴充後的:Inherits="GuestBook.Web.ViewPage<GuestBook.Common.Models.GuestBookInfo>"
2>:頁面調用代碼。
<% =Html.MessageBox (Model)%>
總結:通過擴充ViewPage和ViewData實現了對Html的擴充,使得ViewData的功能更加靈活,好用。
註:本文參考Suteki項目。