BrnShop开源网上商城第六讲:扩展视图功能
在正式讲解扩展视图功能以前,我们有必要把视图的工作原理简单说明下。任何一个视图都会被翻译成一个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" ); } } } |
关于这个文件有以下几点给大家说明下:
- 类名格式:生成的类名称格式为"_Page_Views_控制器名_视图名_文件扩展名"。大家可以看到生成的类名为"_Page_Views_Home_Index_cshtml"符合这个格式。
- 父类:如果视图不是强类型视图则此类继承自System.Web.Mvc.WebViewPage<dynamic>,如果视图为强类型视图则继承自System.Web.Mvc.WebViewPage<指定的模型类>。
- 输出:通过调用此类的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开源网上商城第六讲:扩展视图功能的更多相关文章
- BrnShop开源网上商城第四讲:自定义插件
重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www.brnshop.com. 好了现在进入今天的 ...
- BrnShop开源网上商城第五讲:自定义视图引擎
今天这篇博文主要讲解自定义视图引擎,大家都知道在asp.net mvc框架中默认自带一个Razor视图引擎,除此之外我们也可以自定义自己的视图引擎,只需要实现IViewEngine接口,接口定义如下: ...
- BrnShop开源网上商城第一讲:架构设计
首先在此感谢大家对BrnShop项目的支持和鼓励!我们在发布BrnShop以前曾推测项目会受到不少园友的支持,但没想到园友们的支持大大超过我们的预测.4天6000次浏览,140个推荐,170个评论,8 ...
- BrnShop开源网上商城第二讲:ASP.NET MVC框架
在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择.下面我依次来说明下. 首先是数据的复用和传递:对于BrnShop的每一 ...
- BrnShop开源网上商城第三讲:插件的工作机制
这几天BrnShop的开发工作比较多,所以这一篇文章来的晚了一些,还请大家见谅呀!还有通知大家一下BrnShop1.0.312版本已经发布,此版本添加了报表统计等新功能,需要源码的园友可以点此下载.好 ...
- 【JAVAWEB学习笔记】网上商城实战5:后台的功能模块
今日任务 完成后台的功能模块 1.1 网上商城的后台功能的实现: 1.1.1 后台的功能的需求: 1.1.1.1 分类管理: [查询所有分类] * 在左侧菜单页面中点击分类管理: * ...
- Python 开源网上商城项目
django-oscar https://github.com/django-oscar/django-oscar#screenshots django-shop https://github.c ...
- 开源Asp.Net MVC网上商城BrnShop
开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载 BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一 ...
- 重磅来袭,开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(转)
BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一旦整理完成也全部开源). 啥话也不说了,直接上源码:下载源码(由于公司服 ...
随机推荐
- 4.MySQL连接并选择数据库(SQL & C)
在连接了MySQL数据库之后,可以通过SQL命令或者C.PHP.JAVA等程序来指定需要操作的数据库.这里主要介绍SQL命令和相应的C程序. 首先创建用户rick(赋予所有权限) mysql> ...
- PythonCrawl自学日志(4)
2016年9月22日10:34:02一.Selector1.如何构建(1)text构建: body = '<html><body><span>good</sp ...
- Oracle表空间传输测试
源数据库平台:window 7 64bit Oracle 11g 64bit目标数据库平台:RHEL6 64bit Oracle 11g 64bit 1.查看数据集 select * from nls ...
- C# 目录与文件管理
文件读写 学习了一点点希望对以后的学习工作有帮助 在应用程序中基本任务是对数据的操作,这就是对数据进行访问和保存挤兑数据的读写,应用程序访问一个文本文件叫做“读”:对文本文件的内容进行修改后保存这些修 ...
- PL/SQL — 集合及常用方法
PL/SQL中提供了常用的三种集合联合数组.嵌套表.变长数组,而对于这几个集合类型中元素的操作,PL/SQL提供了相应的函数或过程来操纵数组中的元素或下标.这些函数或过程称为集合方法.一个集合方法就是 ...
- data structure online video
http://www.onlinevideolecture.com/computer-science/nptel-iit-delhi/data-structures-and-algorithms/?c ...
- 织梦dede_archives文章主表详细介绍
dede_archives文章主表,存放着各频道文章的主要信息,比如创建时间,所属栏目,所属频道,作者等详细的信息. ID int(11) 自动编号typeid int(11) 所属主栏目编号 ...
- 再写FFT模板
没什么好说的,今天又考了FFT(虽然不用FFT也能过)但是确实有忘了怎么写FFT了,于是乎只有重新写一遍FFT模板练一下手了.第一部分普通FFT,第二部分数论FFT,记一下模数2^23*7*17+1 ...
- Linux +apache+fastcgi运行c/c++
在Linux上搭建apache+fastcgi环境,说多了都是泪啊. 花费我几天时间,开源软件虽说好用,但是版本众多,文档缺乏,什么都只能自己摸索. 终于成功运行起来,特此记录. 一. apache ...
- PHP reset() 函数
定义和用法 reset()函数把数组的内部指针指向第一个元素,并返回这个元素的值.若失败,则返回 FALSE. reset()函数用来将数组指针设置回数组的开始位置.如果需要在一个脚本中多次查看或处理 ...