看到AnyTao和TerryLee分享的關於ASP
NET MVC使用和優化的技巧
不免手癢
也分享一下這一年多來ASP
NET MVC開發的積累
其中未必是一些高效的技巧
但是的確是能解決問題
也未必有什麼高深的原理
只是我覺得值得分享
Controller來控制HTML的Title
我想大部分朋友都有在Controller裡面指定Html頁面Title的需求
我習慣於先寫使用的代碼再去完善其實現
而指定一個Title最方便的形式莫過於
: public ActionResult Index(int id) {
: var article=DbGetArticle(id);//獲取數據庫裡的文章
: Title=articleName;
: return View();
: }
當然
這段代碼是不能執行的
因為Controller並沒有內建的Title屬性
不過沒關系
我們可以自定義一個
: abstract public class MyBaseController : Controller {
: public string Title {
: set {
: ViewData[Page_Title] = value;
: }
: }
: }
然後將我們的Controller換為這個MyBaseController
之後在Master中寫ViewData[
Page_Title
]的輸出就好了
: <title><%=ViewData[Page_Title] %></title>
OK
這個願意實現了
當然做SEO的話Keyword和Description也可以這樣來搞
ViewModel中傳遞Controller中定義的上下文
老趙十分推ViewModel於是我也做了不少這方面的實踐
發現的確不錯
但是有個問題
就是Controller中產生的上下文怎麼傳到View中去
比如說自定義的用戶信息
等一些非static的類型
而我又不想到View中再實例化一遍
解決方法
ViewModel中另加一上下文屬性(在我和程序中這些上下文繼承於IContext接口
而在Controller中它的屬性是CHContext)
: public class HomeIndexViewModel {
: public IContext Context { get; set; }//這個屬性就是解決它的方法
: public string Message { get; set; }
: }
而我在Controller中
: public ActionResult Index() {
: HomeIndexViewModel model = new HomeIndexViewModel {
: Context = CHContext//這裡傳遞
: Message=Welcome to ASPNET MVC!
: };
: return View(model);
: }
而View中
: <%@ Page Language=C# MasterPageFile=~/Views/Shared/SiteMaster
: Inherits=SystemWebMvcViewPage<HomeIndexViewModel> %>
: <asp:Content ID=indexTitle ContentPlaceHolderID=TitleContent runat=server>
: Home Page
: </asp:Content>
: <asp:Content ID=indexContent ContentPlaceHolderID=MainContent runat=server>
: <h><%= HtmlEncode(ModelMessage) %></h>
: </asp:Content>
這樣我們就可以實現將Controller中產生的自定義上下文傳遞了
不過每個ViewModel都初始化一個IContext
未免太過頻繁
也累人
於是進一步改進
我們利用作用在Controller上的Filter
在Controller的基類我們自定義的 MyBaseController中寫如下Filter
而實現這個功能則要所有的ViewModel繼承於一個類
MyBaseViewModel
MyBaseViewModel與Model
: public class MyBaseViewModel {
: public IContext Context { get; set; }
: }
:
: public class HomeIndexViewModel:MyBaseViewModel {
: public string Message { get; set; }
: }
Controller與Filter
: abstract public class BaseController : Controller {
: protected override void OnResultExecuting(ResultExecutingContext filterContext) {
: var m = ViewDataModel as BaseViewModel;
: if (m != null){
: mContext = CHContext;//在這裡初始化
: }
: }
: }
這回我們在Controller裡使用時就清爽了
不用再傳遞CHContext了
From:http://tw.wingwit.com/Article/program/net/201311/11627.html