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" );
 
 
         }
     }
}

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

  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>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值