html5中文学习网

您的位置: 首页 > 网络编程 > ASP.NET » 正文

ASP.NET MVC雕虫小技 1-2_.NET教程_编程技术

[ ] 已经帮助:人解决问题
看到AnyTao和TerryLee分享的关于ASP.NET MVC使用和优化的技巧,不免手痒,也分享一下这一年多来ASP.NET MVC开发的积累。

  其中未必是一些高效的技巧,但是的确是能解决问题,也未必有什么高深的原理,只是我觉得值得分享。bMmHTML5中文学习网 - HTML5先行者学习网

  1.Controller来控制HTML的TitlebMmHTML5中文学习网 - HTML5先行者学习网

  我想大部分朋友都有在Controller里面指定Html页面Title的需求。bMmHTML5中文学习网 - HTML5先行者学习网

  我习惯于先写使用的代码再去完善其实现,而指定一个Title最方便的形式莫过于:bMmHTML5中文学习网 - HTML5先行者学习网

1: public ActionResult Index(int id) {  bMmHTML5中文学习网 - HTML5先行者学习网

2:     var article=Db.GetArticle(id);//获取数据库里的文章  bMmHTML5中文学习网 - HTML5先行者学习网

3:     Title=article.Name;  bMmHTML5中文学习网 - HTML5先行者学习网

4:     return View();  bMmHTML5中文学习网 - HTML5先行者学习网

5: }  bMmHTML5中文学习网 - HTML5先行者学习网

  当然,这段代码是不能执行的,因为Controller并没有内建的Title属性,不过没关系,我们可以自定义一个: bMmHTML5中文学习网 - HTML5先行者学习网

1: abstract public class MyBaseController : Controller {  bMmHTML5中文学习网 - HTML5先行者学习网

2:        public string Title {  bMmHTML5中文学习网 - HTML5先行者学习网

3:            set {  bMmHTML5中文学习网 - HTML5先行者学习网

4:                ViewData["Page_Title"] = value;  bMmHTML5中文学习网 - HTML5先行者学习网

5:            }  bMmHTML5中文学习网 - HTML5先行者学习网

6:        }  bMmHTML5中文学习网 - HTML5先行者学习网

7: } bMmHTML5中文学习网 - HTML5先行者学习网


  然后将我们的Controller换为这个MyBaseController,之后在Master中写ViewData[“Page_Title”]的输出就好了。bMmHTML5中文学习网 - HTML5先行者学习网


1: <title><%=ViewData["Page_Title"] %></title>  bMmHTML5中文学习网 - HTML5先行者学习网

  OK,这个愿意实现了。bMmHTML5中文学习网 - HTML5先行者学习网

  当然做SEO的话Keyword和Description也可以这样来搞。
 2.ViewModel中传递Controller中定义的上下文bMmHTML5中文学习网 - HTML5先行者学习网

  老赵十分推ViewModel于是我也做了不少这方面的实践,发现的确不错。但是有个问题,就是Controller中产生的上下文怎么传到View中去,比如说自定义的用户信息,等一些非static的类型,而我又不想到View中再实例化一遍。bMmHTML5中文学习网 - HTML5先行者学习网

  解决方法:ViewModel中另加一上下文属性(在我和程序中这些上下文继承于IContext接口,而在Controller中它的属性是CHContext)bMmHTML5中文学习网 - HTML5先行者学习网


1: public class HomeIndexViewModel {  bMmHTML5中文学习网 - HTML5先行者学习网

2:     public IContext Context { get; set; }//这个属性就是解决它的方法  bMmHTML5中文学习网 - HTML5先行者学习网

3:     public string Message { get; set; }  bMmHTML5中文学习网 - HTML5先行者学习网

4: } bMmHTML5中文学习网 - HTML5先行者学习网


  而我在Controller中:  bMmHTML5中文学习网 - HTML5先行者学习网

1: public ActionResult Index() {  bMmHTML5中文学习网 - HTML5先行者学习网

2:     HomeIndexViewModel model = new HomeIndexViewModel {  bMmHTML5中文学习网 - HTML5先行者学习网

3:         Context = CHContext,//这里传递  bMmHTML5中文学习网 - HTML5先行者学习网

4:         Message="Welcome to ASP.NET MVC!"  bMmHTML5中文学习网 - HTML5先行者学习网

5:     };  bMmHTML5中文学习网 - HTML5先行者学习网

6:     return View(model);  bMmHTML5中文学习网 - HTML5先行者学习网

7: } bMmHTML5中文学习网 - HTML5先行者学习网


  而View中:bMmHTML5中文学习网 - HTML5先行者学习网


1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"  bMmHTML5中文学习网 - HTML5先行者学习网

2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>  bMmHTML5中文学习网 - HTML5先行者学习网

3: <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">  bMmHTML5中文学习网 - HTML5先行者学习网

4:     Home Page  bMmHTML5中文学习网 - HTML5先行者学习网

5: </asp:Content>  bMmHTML5中文学习网 - HTML5先行者学习网

6: <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">  bMmHTML5中文学习网 - HTML5先行者学习网

7:     <h2><%= Html.Encode(Model.Message) %></h2>  bMmHTML5中文学习网 - HTML5先行者学习网

8: </asp:Content> bMmHTML5中文学习网 - HTML5先行者学习网

  这样我们就可以实现将Controller中产生的自定义上下文传递了。不过每个ViewModel都初始化一个IContext,未免太过频繁,也累人,于是进一步改进,我们利用作用在Controller上的Filter,在Controller的基类我们自定义的 MyBaseController中写如下Filter,而实现这个功能则要所有的ViewModel继承于一个类:MyBaseViewModel:bMmHTML5中文学习网 - HTML5先行者学习网

  MyBaseViewModel与Model:bMmHTML5中文学习网 - HTML5先行者学习网


1: public class MyBaseViewModel {  bMmHTML5中文学习网 - HTML5先行者学习网

2:     public IContext Context { get; set; }  bMmHTML5中文学习网 - HTML5先行者学习网

3: }  bMmHTML5中文学习网 - HTML5先行者学习网

4:    bMmHTML5中文学习网 - HTML5先行者学习网

5: public class HomeIndexViewModel:MyBaseViewModel {  bMmHTML5中文学习网 - HTML5先行者学习网

6:     public string Message { get; set; }  bMmHTML5中文学习网 - HTML5先行者学习网

7: }  bMmHTML5中文学习网 - HTML5先行者学习网

  Controller与Filter  bMmHTML5中文学习网 - HTML5先行者学习网

1: abstract public class BaseController : Controller {  bMmHTML5中文学习网 - HTML5先行者学习网

2:     protected override void OnResultExecuting(ResultExecutingContext filterContext) {  bMmHTML5中文学习网 - HTML5先行者学习网

3:         var m = ViewData.Model as BaseViewModel;  bMmHTML5中文学习网 - HTML5先行者学习网

4:         if (m != null){  bMmHTML5中文学习网 - HTML5先行者学习网

5:             m.Context = CHContext;//在这里初始化  bMmHTML5中文学习网 - HTML5先行者学习网

6:         }  bMmHTML5中文学习网 - HTML5先行者学习网

7:     }  bMmHTML5中文学习网 - HTML5先行者学习网

8: } bMmHTML5中文学习网 - HTML5先行者学习网


  这回我们在Controller里使用时就清爽了,不用再传递CHContext了
 bMmHTML5中文学习网 - HTML5先行者学习网

bMmHTML5中文学习网 - HTML5先行者学习网
bMmHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助