淺談ASP.NET MVC使用
看到AnyTao和TerryLee分享的關(guān)于ASP.NET MVC使用技巧,不免手癢,也分享一下這一年多來ASP.NET MVC使用的積累。
其中未必是一些高效的技巧,但是的確是能解決問題,也未必有什么高深的原理,只是我覺得值得分享。
1.Controller來控制HTML的Title
我想大部分朋友都有在Controller里面指定Html頁面Title的需求。我習(xí)慣于先寫使用的代碼再去完善其實(shí)現(xiàn),而指定一個(gè)Title最方便的形式莫過于:
- public ActionResult Index(int id) {
- var article=Db.GetArticle(id);//獲取數(shù)據(jù)庫里的文章
- Title=article.Name;
- return View();
- }
當(dāng)然,這段代碼是不能執(zhí)行的,因?yàn)镃ontroller并沒有內(nèi)建的Title屬性,不過沒關(guān)系,我們可以自定義一個(gè):
- abstract public class MyBaseController : Controller {
- public string Title {
- set {
- ViewData["Page_Title"] = value;
- }
- }
- }
然后將我們的Controller換為這個(gè)MyBaseController,之后在Master中寫ViewData[“Page_Title”]的輸出就好了。
OK,這個(gè)愿意實(shí)現(xiàn)了。當(dāng)然做SEO的話Keyword和Description也可以這樣來搞。
2.ViewModel中傳遞Controller中定義的上下文
老趙十分推ViewModel于是我也做了不少這方面的實(shí)踐,發(fā)現(xiàn)的確不錯(cuò)。但是有個(gè)問題,就是Controller中產(chǎn)生的上下文怎么傳到View中去,比如說自定義的用戶信息,等一些非static的類型,而我又不想到View中再實(shí)例化一遍。
解決方法:ViewModel中另加一上下文屬性(在我和程序中這些上下文繼承于IContext接口,而在Controller中它的屬性是CHContext)
- public class HomeIndexViewModel {
- public IContext Context { get; set;
- }
- //這個(gè)屬性就是解決它的方法
- public string Message { get; set; }
- }
而我在Controller中:
- public ActionResult Index() {
- HomeIndexViewModel model = new HomeIndexViewModel {
- Context = CHContext,//這里傳遞
- Message="Welcome to ASP.NET MVC!"
- };
- return View(model);
- }
而View中:
- <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
- Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>
- <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
- Home Page
- </asp:Content>
- <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
- <h2><%= Html.Encode(Model.Message) %></h2>
- </asp:Content>
這樣我們就可以實(shí)現(xiàn)將Controller中產(chǎn)生的自定義上下文傳遞了。不過每個(gè)ViewModel都初始化一個(gè)IContext,未免太過頻繁,也累人,于是進(jìn)一步改進(jìn),我們利用作用在Controller上的Filter,在Controller的基類我們自定義的 MyBaseController中寫如下Filter,而實(shí)現(xiàn)這個(gè)功能則要所有的ViewModel繼承于一個(gè)類: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 = ViewData.Model as BaseViewModel;
- if (m != null){
- m.Context = CHContext;//在這里初始化
- }
- }
- }
這回我們?cè)贑ontroller里使用時(shí)就清爽了,不用再傳遞CHContext了。以上介紹ASP.NET MVC使用技巧
【編輯推薦】