看到AnyTao和TerryLee分享的关于ASPNET MVC使用和优化的技巧不免手痒也分享一下这一年多来ASPNET MVC开发的积累
其中未必是一些高效的技巧但是的确是能解决问题也未必有什么高深的原理只是我觉得值得分享
Controller来控制HTML的Title
我想大部分朋友都有在Controller里面指定Html页面Title的需求
我习惯于先写使用的代码再去完善其实现而指定一个Title最方便的形式莫过于
: public ActionResult Index(int id) {
: var article=DbGetArticle(id);//获取数据库里的文章
: Title=articleName;
: return View();
: }
当然这段代码是不能执行的因为Controller并没有内建的Title属性不过没关系我们可以自定义一个
: abstract public class MyBaseController : Controller {
: public string Title {
: set {
: ViewData[Page_Title] = value;
: }
: }
: }
然后将我们的Controller换为这个MyBaseController之后在Master中写ViewData[Page_Title]的输出就好了
: <title><%=ViewData[Page_Title] %></title>
OK这个愿意实现了
当然做SEO的话Keyword和Description也可以这样来搞
ViewModel中传递Controller中定义的上下文
老赵十分推ViewModel于是我也做了不少这方面的实践发现的确不错但是有个问题就是Controller中产生的上下文怎么传到View中去比如说自定义的用户信息等一些非static的类型而我又不想到View中再实例化一遍
解决方法ViewModel中另加一上下文属性(在我和程序中这些上下文继承于IContext接口而在Controller中它的属性是CHContext)
: public class HomeIndexViewModel {
: public IContext Context { get; set; }//这个属性就是解决它的方法
: public string Message { get; set; }
: }
而我在Controller中
: public ActionResult Index() {
: HomeIndexViewModel model = new HomeIndexViewModel {
: Context = CHContext//这里传递
: Message=Welcome to ASPNET MVC!
: };
: return View(model);
: }
而View中
: <%@ Page Language=C# MasterPageFile=~/Views/Shared/SiteMaster
: Inherits=SystemWebMvcViewPage<HomeIndexViewModel> %>
: <asp:Content ID=indexTitle ContentPlaceHolderID=TitleContent runat=server>
: Home Page
: </asp:Content>
: <asp:Content ID=indexContent ContentPlaceHolderID=MainContent runat=server>
: <h><%= HtmlEncode(ModelMessage) %></h>
: </asp:Content>
这样我们就可以实现将Controller中产生的自定义上下文传递了不过每个ViewModel都初始化一个IContext未免太过频繁也累人于是进一步改进我们利用作用在Controller上的Filter在Controller的基类我们自定义的 MyBaseController中写如下Filter而实现这个功能则要所有的ViewModel继承于一个类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 = ViewDataModel as BaseViewModel;
: if (m != null){
: mContext = CHContext;//在这里初始化
: }
: }
: }
这回我们在Controller里使用时就清爽了不用再传递CHContext了