在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下。任何一个视图都会被翻译成一个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. ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused

    工具/原料:Ubuntu 在采用scp在不同机器之间进行文件拷贝时出现标题所示的错误,原因可能是: 1.sshd 未启动 2.sshd 未安装 3.防火墙 4需重新启动ssh 服务 查看sshd进程方 ...

  2. TreeMap 红黑树实现

    TreeMap 是一个有序的key-value集合,它是通过 红黑树 实现的. TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合. TreeMap 实现了 ...

  3. 啊哈!算法:解密QQ号

    书中给出的算法有点浪费空间,可以使用循环队列进行改进,这样就不需要使用额外的空间,在原数组的基础上就可以完成解密,代码如下: #include <stdio.h> void decode( ...

  4. jquery鼠标样式

    浏览器是有自带的鼠标样式的,如果某些时候为了保持鼠标样式的统一,或者想指定特定的鼠标样式该怎么办呢?那就要使用自定义了,下面有个不错的示例,喜欢的朋友可以参考下   1.浏览器自带的鼠标样式:  2. ...

  5. ASP.NET MVC5 PagedList分页示例

    ASP.NET MVC是目前ASP.NET开发当中轻量级的Web开发解决方案,在ASP.NET MVC概述这篇译文当中,已经详细的介绍了ASP.NET MVC与Web Forms的区别以及各自的适用场 ...

  6. js调用asp.net 后台属性值

    后台代码: public string title = "js调用后台属性值"; public void getContent() { return title; } 前台代码: ...

  7. AngularJS(3)-过滤器

    过滤器可以通过一个管道字符(|)和一个过滤器添加到表达式中.. 1.uppercase/lowercase 大小写过滤器 2.currency过滤器 3.向指令添加过滤器 过滤器可以通过一个管道字符( ...

  8. PHPCMS 核心代码与 www 分离部署

    为了满足更多用户二次开发的兴趣与爱好,同时,为了更加安全.可以通过修改入口代码的包含方式来让主程序和www程序分开. 先看下面目录结构: (图1) 我们需要将 phpcms 目录和 index.php ...

  9. Django基本操作命令

    1.新建一个django项目 django-admin.py startproject project-name 2.新建一个app python manage.py startapp app-nam ...

  10. SQL学习_查询重复数据和连接多个表数据的方法

    进行数据库测试时需要根据不同场景查询数据,以便验证发现的问题是否为脏数据引起的.记录一下最近常用的查询方法: 1. 查询表中重复数据(id不同,多个字段值相同) select P1.* from pr ...