MonoRail学习笔记十八:在VM中可以使用哪些系统变量

本文详细介绍了NVelocityViewEngine类的CreateContext方法中定义的系统变量,这些变量允许在vm环境中直接访问控制器的方法、属性、资源及参数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道在vm中可以直接使用SessionSiteRoot等,那么我们还可以使用哪些默认的系统变量呢?

其实可以直接在vm中使用的系统变量都是在NVelocityViewEngine类的CreateContext方法中定义的。下面我们就看看到底定义了哪些(详见代码中的注释说明):
1privateIContextCreateContext(IRailsEngineContextcontext,Controllercontroller)
2{
3HashtableinnerContext=newHashtable(StringComparer.InvariantCultureIgnoreCase);
4//对应的controller中的方法和属性可以直接在vm中使用
5innerContext.Add(TemplateKeys.Controller,controller);
//当前请求的上下文,请求,Session等可以直接使用
6innerContext.Add(TemplateKeys.Context,context);
7innerContext.Add(TemplateKeys.Request,context.Request);
8innerContext.Add(TemplateKeys.Response,context.Response);
9innerContext.Add(TemplateKeys.Session,context.Session);
10
//对应的controller中的Resources中所有资源可以直接在vm中使用
11if(controller.Resources!=null)
12{
13foreach(Stringkeyincontroller.Resources.Keys)
14{
15innerContext[key]=controller.Resources[key];
16}

17}

18
//所有Params中的值可以直接在vm中使用
19foreach(Stringkeyincontext.Params.AllKeys)
20{
21if(key==null)continue;//Nastybug?
22objectvalue=context.Params[key];
23if(value==null)continue;
24innerContext[key]=value;
25}

26
27//listfrom:http://msdn2.microsoft.com/en-us/library/hfa3fa08.aspx
28object[]builtInHelpers=
29newobject[]
30{
31newStaticAccessorHelper<Byte>(),
32newStaticAccessorHelper<SByte>(),
33newStaticAccessorHelper<Int16>(),
34newStaticAccessorHelper<Int32>(),
35newStaticAccessorHelper<Int64>(),
36newStaticAccessorHelper<UInt16>(),
37newStaticAccessorHelper<UInt32>(),
38newStaticAccessorHelper<UInt64>(),
39newStaticAccessorHelper<Single>(),
40newStaticAccessorHelper<Double>(),
41newStaticAccessorHelper<Boolean>(),
42newStaticAccessorHelper<Char>(),
43newStaticAccessorHelper<Decimal>(),
44newStaticAccessorHelper<String>(),
45newStaticAccessorHelper<Guid>(),
46newStaticAccessorHelper<DateTime>()
47}
;
48
//常见的系统类可以之间使用,比如可以直接在vm中使用$Int32.MaxValue
49foreach(objecthelperinbuiltInHelpers)
50{
51innerContext[helper.GetType().GetGenericArguments()[0].Name]=helper;
52}

53
//定义的Helper类可以直接在vm中使用
54if(controller.Helpers!=null)
55{
56foreach(objectkeyincontroller.Helpers.Keys)
57{
58innerContext[key]=controller.Helpers[key];
59}

60}

61
62//Addingflashasacollectionandeachindividualitem
63//定义的Flash值可以直接使用
64if(context.Flash!=null)
65{
66innerContext[Flash.FlashKey]=context.Flash;
67
68foreach(DictionaryEntryentryincontext.Flash)
69{
70if(entry.Value==null)continue;
71innerContext[entry.Key]=entry.Value;
72}

73}

74//定义的PropertyBag值可以直接使用
75if(controller.PropertyBag!=null)
76{
77foreach(DictionaryEntryentryincontroller.PropertyBag)
78{
79if(entry.Value==null)continue;
80innerContext[entry.Key]=entry.Value;
81}

82}

83//SiteRoot可以直接使用 ---取得的是应用程序的路径
84innerContext[TemplateKeys.SiteRoot]=context.ApplicationPath;
85
86returnnewVelocityContext(innerContext);
87}

欢迎加入:http://www.itpob.cn/bbs

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值