前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ASP.NET MVC雕虫小技 1-2

ASP.NET MVC雕虫小技 1-2

作者头像
重典
发布2022-04-11 12:46:57
3300
发布2022-04-11 12:46:57
举报
文章被收录于专栏:重典.NET

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

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

1.Controller来控制HTML的Title

我想大部分朋友都有在Controller里面指定Html页面Title的需求。

我习惯于先写使用的代码再去完善其实现,而指定一个Title最方便的形式莫过于:

代码语言:javascript
复制
1: public ActionResult Index(int id) {

       2:     var article=Db.GetArticle(id);//获取数据库里的文章

       3:     Title=article.Name;

       4:     return View();

       5: }

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

代码语言:javascript
复制
1: abstract public class MyBaseController : Controller {

       2:        public string Title {

       3:            set {

       4:                ViewData["Page_Title"] = value;

       5:            }

       6:        }

       7: }

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

代码语言:javascript
复制
1: <title><%=ViewData["Page_Title"] %></title>

OK,这个愿意实现了。

当然做SEO的话Keyword和Description也可以这样来搞。

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

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

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

代码语言:javascript
复制
1: public class HomeIndexViewModel {

       2:     public IContext Context { get; set; }//这个属性就是解决它的方法

       3:     public string Message { get; set; }

       4: }

而我在Controller中:

代码语言:javascript
复制
1: public ActionResult Index() {

       2:     HomeIndexViewModel model = new HomeIndexViewModel {

       3:         Context = CHContext,//这里传递

       4:         Message="Welcome to ASP.NET MVC!"

       5:     };

       6:     return View(model);

       7: }

而View中:

代码语言:javascript
复制
1: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"

       2: Inherits="System.Web.Mvc.ViewPage<HomeIndexViewModel>" %>

       3: <asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">

       4:     Home Page

       5: </asp:Content>

       6: <asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

       7:     <h2><%= Html.Encode(Model.Message) %></h2>

       8: </asp:Content>

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

MyBaseViewModel与Model:

代码语言:javascript
复制
1: public class MyBaseViewModel {

       2:     public IContext Context { get; set; }

       3: }

       4:  

       5: public class HomeIndexViewModel:MyBaseViewModel {

       6:     public string Message { get; set; }

       7: }

Controller与Filter

代码语言:javascript
复制
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:     }

       8: }

这回我们在Controller里使用时就清爽了,不用再传递CHContext了。

如有意见欢迎提出

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Controller来控制HTML的Title
  • 2.ViewModel中传递Controller中定义的上下文
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档