找回密码
 立即注册
首页 业界区 业界 ASP.NET MVC雕虫小技 1-2

ASP.NET MVC雕虫小技 1-2

东新 2025-5-29 20:39:02
看到AnyTao和TerryLee分享的关于ASP.NET MVC使用和优化的技巧,不免手痒,也分享一下这一年多来ASP.NET MVC开发的积累。
  其中未必是一些高效的技巧,但是的确是能解决问题,也未必有什么高深的原理,只是我觉得值得分享。
  1.Controller来控制HTML的Title

  我想大部分朋友都有在Controller里面指定Html页面Title的需求。
  我习惯于先写使用的代码再去完善其实现,而指定一个Title最方便的形式莫过于:
         
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>public ActionResult Index(int id) {
复制代码
  
  1.    2:     var article=Db.GetArticle(id);//获取数据库里的文章
复制代码
  
  1.    2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>    Title=article.Name;
复制代码
  
  1.    4:     return View();
复制代码
  
  1.    4:     Home Page}
复制代码
当然,这段代码是不能执行的,因为Controller并没有内建的Title属性,不过没关系,我们可以自定义一个:
     
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>abstract public class MyBaseController : Controller {
复制代码
  
  1.    2:        public string Title {
复制代码
  
  1.    2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>           set {
复制代码
  
  1.    4:                ViewData["Page_Title"] = value;
复制代码
  
  1.    4:     Home Page           }
复制代码
  
  1.    5: </asp:Content>       }
复制代码
  
  1.    6:     public string Message { get; set; }
复制代码
然后将我们的Controller换为这个MyBaseController,之后在Master中写ViewData[“Page_Title”]的输出就好了。
     
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>
复制代码
OK,这个愿意实现了。
当然做SEO的话Keyword和Description也可以这样来搞。
2.ViewModel中传递Controller中定义的上下文

老赵十分推ViewModel于是我也做了不少这方面的实践,发现的确不错。但是有个问题,就是Controller中产生的上下文怎么传到View中去,比如说自定义的用户信息,等一些非static的类型,而我又不想到View中再实例化一遍。
解决方法:ViewModel中另加一上下文属性(在我和程序中这些上下文继承于IContext接口,而在Controller中它的属性是CHContext)
     
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>public class HomeIndexViewModel {
复制代码
  
  1.    1: public class MyBaseViewModel {//这个属性就是解决它的方法
复制代码
  
  1.    2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>    public string Message { get; set; }
复制代码
  
  1.    4: }
复制代码
而我在Controller中:
     
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>public ActionResult Index() {
复制代码
  
  1.    2:     HomeIndexViewModel model = new HomeIndexViewModel {
复制代码
  
  1.    2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>        Context = CHContext,//这里传递
复制代码
  
  1.    4:         Message="Welcome to ASP.NET MVC!"
复制代码
  
  1.    4:     Home Page    };
复制代码
  
  1.    5: </asp:Content>    return View(model);
复制代码
  
  1.    6:     public string Message { get; set; }
复制代码
而View中:
     
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>
复制代码
  
  1.    2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>
复制代码
  
  1.    3:
复制代码
  
  1.    4:     Home Page
复制代码
  
  1.    5: </asp:Content>
复制代码
  
  1.    6:
复制代码
  
  1.    7:     <h2><%= Html.Encode(Model.Message) %></h2>
复制代码
这样我们就可以实现将Controller中产生的自定义上下文传递了。不过每个ViewModel都初始化一个IContext,未免太过频繁,也累人,于是进一步改进,我们利用作用在Controller上的Filter,在Controller的基类我们自定义的MyBaseController中写如下Filter,而实现这个功能则要所有的ViewModel继承于一个类:MyBaseViewModel:
MyBaseViewModel与Model:
     
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>public class MyBaseViewModel {
复制代码
  
  1.    1: public class MyBaseViewModel {
复制代码
  
  1.    2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>}
复制代码
  
  1.    3: }
复制代码
  
  1.    4:     Home Pagepublic class HomeIndexViewModel:MyBaseViewModel {
复制代码
  
  1.    5: </asp:Content>    public string Message { get; set; }
复制代码
  
  1.    6:     public string Message { get; set; }
复制代码
Controller与Filter
     
  1.    1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"<title><%=ViewData["Page_Title"] %></title>abstract public class BaseController : Controller {
复制代码
  
  1.    1: abstract public class BaseController : Controller {
复制代码
  
  1.    2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>        var m = ViewData.Model as BaseViewModel;
复制代码
  
  1.    3:         var m = ViewData.Model as BaseViewModel;
复制代码
  
  1.    4:     Home Page            m.Context = CHContext;//在这里初始化
复制代码
  
  1.    5: </asp:Content>        }
复制代码
  
  1.    6:         }
复制代码
  
  1.    7:     <h2><%= Html.Encode(Model.Message) %></h2>}
复制代码
这回我们在Controller里使用时就清爽了,不用再传递CHContext了。
 
如有意见欢迎提出

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册