ASP.NET MVC Customize Base View

在寫 ASP.NET MVC 的時候,我幾乎都會讓 Controller 繼承一個自訂的 BaseController ,在某些情況下會方便不少,像是登入帳號共用 Session 或是一些其他共用的功能跟頁面驗證都可以利用繼承來大量設定。不過在跟 View 整合的時候就會在一頁一頁去用 ViewBag 或是 ViewData 傳參數,有時候很多 View 都會同時用到一樣的 ViewBag 或是 ViewData 。 其實在 ASP.NET MVC 也有 Base View 這種東西。

建立 Base View

Razor View 預設都會繼承 System.Web.Mvc.WebViewPage ,所以原理也是一樣,只要自訂一個類別先繼承 System.Web.Mvc.WebViewPage ,再讓 View 來繼承 Base 類別,就達到了在之間抽離一層來實作一些共用的方法。

public abstract class BaseViewPage<T> : 
System.Web.Mvc.WebViewPage<T>
{
...
}

在這邊必須要繼承 System.Web.Mvc.WebViewPage<T>  泛型的類別就是強型別的類別,加入一個判斷登入語系的 ViewBag ,這個 ViewBag 在 Base Controller 就會判斷完成,所以每一個頁面都會需要用到。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace BaseViewTest.Views
{
public abstract class BaseViewPage<T> :
System.Web.Mvc.WebViewPage<T>
{

public string Language
{
get
{
return ViewBag.Lang;
}
}

public override void Execute()
{

}
}
}

在 MVC 4 之後 System.Web.Mvc.WebViewPage<T> 必須要實作 Execute() 方法。

讓 View 繼承 Base View

建立完 Base View 之後就是要讓其他 View 繼承這個 Class ,這個就需要在 Web.Config 中設定,我是設定在 View 資料夾下的 Web.Config (不是最外層喔)

<pages pageBaseType="BaseViewTest.Views.BaseViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
</namespaces>
</pages>

在最外層的 Web.Config 也有 <Page pageBaseType> 標籤可以做屬性設定,不過一樣在內層也必須要再設定一次。

直接使用 Base View

接下來如果是需要使用到寫在 Base View 裡面的方法或屬性的時候就只要直接呼叫好了

@Language

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *