在Asp.net MVC 1.0正式版中的模板頁中提供了:
<asp:ContentPlaceHolder ID="TitleContent" runat="server" />
這樣可以讓你在每個View中獨立設定頁面標題(Title),不過這樣的弊端就是假如我的頁面標題是如下形式:
統一標題 - 副標題
那麼要在每個View中都寫上:
日記頁面:
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
CaraQ - 日記
</asp:Content>
相冊頁面:
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
CaraQ - 相冊
</asp:Content>
……
假如有一天我要把其中的統一標題改一下那就得一個頁面一個頁面的去改,太過麻煩,而且這種命名標題的方法我認爲也有背MVC的精神--讓控制器決定視圖顯示的內容
其實有更簡單的實現方法,如下:
首先定義每個Controller的父類如下:
public class BaseController : Controller
{
private readonly string _titleFormat = "CaraQ - {0}";
private string _title;
protected string Title
{
get { return _title; }
set { _title = value; }
}
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
ViewData["Title"] = string.Format(_titleFormat, Title);
base.OnActionExecuted(filterContext);
}
}
讓所有的Controller繼承這個父類,設置頁面標題的方法只需要在Action中使用如下方式即可:
{
public ActionResult Index()
{
this.Title = "日記";
}
}
最後在模板頁中把TitleContent佔位控件換成:
這樣就可以了,看到這樣給頁面命名標題是不是就簡單多了,在View中了不會有那個像
<asp:Content ID="titleContent" ContentPlaceHolderID="TitleContent" runat="server"></asp:Content>
的控件了,要修改統一標題時只需要修改BaseController中的_titleFormat字串就可以了