熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET MVC雕蟲小技 1-2

2013-11-13 09:48:16  來源: .NET編程 

看到AnyTao和TerryLee分享的關於ASPNET MVC使用和優化的技巧不免手癢也分享一下這一年多來ASPNET 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
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.