在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下。任何一个视图都会被翻译成一个c#类,并保存到指定的位置,然后被编译。这也就是为什么能在视图中包含c#代码片段的原因。下面我们通过一个项目具体的了解一下这个过程,首先我们新建一个mvc3项目,它的Index.cshtml视图文件的代码如下:

1
2
3
4
5
6
7
8
@{
    ViewBag.Title = "主页";
}
 
<h2>@ViewBag.Message</h2>
<p>
    若要了解有关 ASP.NET MVC 的更多信息,请访问 <a href="http://asp.net/mvc" title="ASP.NET MVC 网站">http://asp.net/mvc</a>。
</p>

  直到应用程序启动之前,mvc应用程序的视图不会被编译,因此要查看此视图翻译成的类,需要启动应用程序,并导航到一个动作方法。可以选择任何动作方法,这是因为,发送到mvc应用程序的最初请求会触发视图编译过程。视图所生成的类被保存在磁盘上,随后被编译。以win7为例,文件保存位置为C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files文件夹(其他版本的操作系统请自行对应)。这里我把上面的这个视图生成的c#类代码帖出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#pragma checksum "C:\Users\Tony\Desktop\MvcApplication1\MvcApplication1\Views\Home\Index.cshtml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "AF52BBBCDF69BE7D53364ACEEB11ED8A27B4CDCE"
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本:4.0.30319.18063
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
 
namespace ASP {
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.Helpers;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.WebPages;
    using System.Web.Mvc;
    using System.Web.Mvc.Ajax;
    using System.Web.Mvc.Html;
    using System.Web.Routing;
     
     
    public class _Page_Views_Home_Index_cshtml : System.Web.Mvc.WebViewPage<dynamic> {
         
#line hidden
 
         
        public _Page_Views_Home_Index_cshtml() {
        }
         
        protected ASP.global_asax ApplicationInstance {
            get {
                return ((ASP.global_asax)(Context.ApplicationInstance));
            }
        }
         
        public override void Execute() {
 
             
            #line 1 "C:\Users\ZhangMeng\Desktop\MvcApplication1\MvcApplication1\Views\Home\Index.cshtml"
   
    ViewBag.Title = "主页";
 
 
             
            #line default
            #line hidden
WriteLiteral("\r\n<h2>");
 
 
             
            #line 5 "C:\Users\ZhangMeng\Desktop\MvcApplication1\MvcApplication1\Views\Home\Index.cshtml"
Write(ViewBag.Message);
 
             
            #line default
            #line hidden
WriteLiteral("</h2>\r\n<p>\r\n    若要了解有关 ASP.NET MVC 的更多信息,请访问 <a href=\"http://asp.net/mvc\" title=\"" +
"ASP.NET MVC 网站\">http://asp.net/mvc</a>。\r\n</p>\r\n");
 
 
        }
    }
}

  关于这个文件有以下几点给大家说明下:

  1. 类名格式:生成的类名称格式为"_Page_Views_控制器名_视图名_文件扩展名"。大家可以看到生成的类名为"_Page_Views_Home_Index_cshtml"符合这个格式。
  2. 父类:如果视图不是强类型视图则此类继承自System.Web.Mvc.WebViewPage<dynamic>,如果视图为强类型视图则继承自System.Web.Mvc.WebViewPage<指定的模型类>。
  3. 输出:通过调用此类的Execute方法输出视图内容。

  至此关于视图的工作原理大家应该有一定的了解了(大家有时间可以多研究一下这个类,对提高mvc水平还是很有帮助的),接下来进入今天的正题:扩展视图功能。通过上面讲解视图的工作原理大家可以看出,要想扩展视图的功能,一个非常好的切入点就是扩展视图基类。我们以多店版网上商城BrnMall为例,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
 
namespace BrnMall.Web.Framework
{
    /// <summary>
    /// 商城前台视图页面基类型
    /// </summary>
    public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
    {
        public WebWorkContext WorkContext;
 
        public override void InitHelpers()
        {
            base.InitHelpers();
            WorkContext = ((BaseWebController)(this.ViewContext.Controller)).WorkContext;
        }
    }
 
    /// <summary>
    /// 商城前台视图页面基类型
    /// </summary>
    public abstract class WebViewPage : WebViewPage<dynamic>
    {
    }
}

  在此类中我们添加了一个属性WorkContext,并在InitHelpers方法中对它进行赋值。这样我们在视图中就可以直接访问这个属性而不需要每次都通过控制器进行类型转换获得。代码如下:

1
2
3
4
@foreach (NavInfo info in WorkContext.NavList)
{
<li><a href="@info.Url">@info.Name</a></li>
}

  不过要想让此视图基类正常工作还需要对视图文件夹中的Web.config文件中进行修改,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  <!--将pageBaseType的默认值替换为WebViewPage类型-->
  <pages pageBaseType="BrnMall.Web.Framework.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      <add namespace="System.Web.Mvc.Ajax" />
      <add namespace="System.Web.Mvc.Html" />
      <add namespace="System.Web.Routing" />
      <add namespace="System.Text" />
      <add namespace="System.Data" />
      <add namespace="System.Collections"/>
      <add namespace="System.Collections.Generic"/>
      <add namespace="BrnMall.Core" />
      <add namespace="BrnMall.Services" />
      <add namespace="BrnMall.Web.Framework" />
      <add namespace="BrnMall.Web.Models" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

  好了,今天的内容到此就结束了。

BrnShop开源网上商城第六讲:扩展视图功能的更多相关文章

  1. BrnShop开源网上商城第四讲:自定义插件

    重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www.brnshop.com. 好了现在进入今天的 ...

  2. BrnShop开源网上商城第五讲:自定义视图引擎

    今天这篇博文主要讲解自定义视图引擎,大家都知道在asp.net mvc框架中默认自带一个Razor视图引擎,除此之外我们也可以自定义自己的视图引擎,只需要实现IViewEngine接口,接口定义如下: ...

  3. BrnShop开源网上商城第一讲:架构设计

    首先在此感谢大家对BrnShop项目的支持和鼓励!我们在发布BrnShop以前曾推测项目会受到不少园友的支持,但没想到园友们的支持大大超过我们的预测.4天6000次浏览,140个推荐,170个评论,8 ...

  4. BrnShop开源网上商城第二讲:ASP.NET MVC框架

    在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择.下面我依次来说明下. 首先是数据的复用和传递:对于BrnShop的每一 ...

  5. BrnShop开源网上商城第三讲:插件的工作机制

    这几天BrnShop的开发工作比较多,所以这一篇文章来的晚了一些,还请大家见谅呀!还有通知大家一下BrnShop1.0.312版本已经发布,此版本添加了报表统计等新功能,需要源码的园友可以点此下载.好 ...

  6. 【JAVAWEB学习笔记】网上商城实战5:后台的功能模块

    今日任务 完成后台的功能模块 1.1      网上商城的后台功能的实现: 1.1.1    后台的功能的需求: 1.1.1.1  分类管理: [查询所有分类] * 在左侧菜单页面中点击分类管理: * ...

  7. Python 开源网上商城项目

    django-oscar  https://github.com/django-oscar/django-oscar#screenshots django-shop  https://github.c ...

  8. 开源Asp.Net MVC网上商城BrnShop

    开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载 BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一 ...

  9. 重磅来袭,开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(转)

    BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一旦整理完成也全部开源). 啥话也不说了,直接上源码:下载源码(由于公司服 ...

随机推荐

  1. Headfirst设计模式的C++实现——迭代器(Iterator)

    iterator.h #ifndef _ITERATOR_H_ #define _ITERATOR_H_ #include "menu_item.h" class Iterator ...

  2. 高并发编程陷阱之check and set

    今天公司CTO跟隔壁部门开技术会,旁听了一下.所讲的内容感觉好高大上啊!简单记录一下 场景是这样的: if(check(id)===true) { }else{ set(id); } 什么意思呢? 就 ...

  3. HTML5之字体

    - 使用CSS样式来定义 context.font = [CSS font property] context.font = [font-style font-variant font-weight ...

  4. JQuery中的动画

    一.show()方法和hide()方法 这两种方法是jQuery动画的最基本方法.当为元素调用show方法时相当于将该元素的display样式改为block或者inline,同理,如果当元素调用hid ...

  5. head 头标签(转发)

    HTML head 头标签 paddingme | 04 Oct 2014 HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商 ...

  6. Windows Linux HackMacintosh

    我想把Windows Linux HackMacintosh三类系统融入到一台笔记本上的神经病应该不多. 我的电脑就一个SATA硬盘,BIOS还不是EFI的.一共同时安装了Windows 8.1.Op ...

  7. WPF中添加Ribbon遇到的问题

    很奇怪的说,当我新建WPF工程,添加RibbonControlsLibary.dll后会运行时会报错,System.Windows.Markup.XamlParseException.引发的异常信息为 ...

  8. HTML5 基础

    1.HTML5 简介 HTML5 是最新的 HTML 标准,他是万维网的核心语言.标准通用标记语言下的一个应用“超文本标记语言”. HTML 的上一个标准 HTML4.01 诞生于 1999年,他的第 ...

  9. Android开发中activity切换动画的实现

    (1)我们在MainAcitvity中定义两个textview,用于点击触发切换Activity事件,下面是布局文件代码. <LinearLayout android:layout_width= ...

  10. 关于实现判断用户是在PC端和还是移动端访问。

    最近一直在忙我们团队的项目“咖啡之翼”,在这个项目中,我们为移动平台提供了一个优秀的体验.伴随Android平台的红火发展.不仅带动国内智能手机行业,而且许多国内开发者也开始投身于Android移动终 ...