浅谈ASP.NET MVC使用
创始人
2024-04-19 23:00:38
0

看到AnyTao和TerryLee分享的关于ASP.NET MVC使用技巧,不免手痒,也分享一下这一年多来ASP.NET MVC使用的积累。

其中未必是一些高效的技巧,但是的确是能解决问题,也未必有什么高深的原理,只是我觉得值得分享。

1.Controller来控制HTML的Title

我想大部分朋友都有在Controller里面指定Html页面Title的需求。我习惯于先写使用的代码再去完善其实现,而指定一个Title最方便的形式莫过于:

  1. public ActionResult Index(int id) {  
  2. var article=Db.GetArticle(id);//获取数据库里的文章  
  3. Title=article.Name;  
  4. return View();  

当然,这段代码是不能执行的,因为Controller并没有内建的Title属性,不过没关系,我们可以自定义一个:

  1. abstract public class MyBaseController : Controller {  
  2. public string Title {  
  3. set {  
  4. ViewData["Page_Title"] = value;  
  5. }  
  6. }  

然后将我们的Controller换为这个MyBaseController,之后在Master中写ViewData[“Page_Title”]的输出就好了。

OK,这个愿意实现了。当然做SEO的话Keyword和Description也可以这样来搞。

2.ViewModel中传递Controller中定义的上下文

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

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

  1. public class HomeIndexViewModel {  
  2. public IContext Context { get; set;   
  3. }  
  4. //这个属性就是解决它的方法  
  5. public string Message { get; set; }  

而我在Controller中:

  1. public ActionResult Index() {  
  2. HomeIndexViewModel model = new HomeIndexViewModel {  
  3. Context = CHContext,//这里传递  
  4. Message="Welcome to ASP.NET MVC!" 
  5. };  
  6. return View(model);  

而View中:

  1. <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
  2. Inherits="System.Web.Mvc.ViewPage" %> 
  3.  ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server"> 
  4. Home Page  
  5.  
  6.  ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> 
  7. <%= Html.Encode(Model.Message) %>

     
  8.  

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

  1. public class MyBaseViewModel {  
  2. public IContext Context { get; set; }  
  3. }   
  4. public class HomeIndexViewModel:MyBaseViewModel {  
  5. public string Message { get; set; }  

Controller与Filter

  1. abstract public class BaseController : Controller {  
  2. protected override void OnResultExecuting(ResultExecutingContext filterContext) {  
  3. var m = ViewData.Model as BaseViewModel;  
  4. if (m != null){  
  5. m.Context = CHContext;//在这里初始化  
  6. }  
  7. }  

这回我们在Controller里使用时就清爽了,不用再传递CHContext了。以上介绍ASP.NET MVC使用技巧

【编辑推荐】

  1. ASP.NET页面显示XML数据
  2. 了解什么是IFRAME ASP.NET
  3. ASP.NET生命周期的展示
  4. 解决ASP.NET AJAX脚本的错误问题
  5. 详解ASP.NET应用程序

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...