一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

NVelocity for ASP.NET MVC

  在我的這篇博文中,有這么一段話:“我一直在想,有沒有辦法可以單獨(dú)限制View中的代碼的訪問權(quán)限,類似于trust level,只是這個(gè)trust level是用來限制模板中的代碼。”。有讀者johngeng問,為什么要用trust level來鎖住view,他不是很理解。我的本意是,希望在view中,開發(fā)人員只能寫某一些特定功能的代碼,調(diào)用某一些特定開放的API,對(duì)于大部分安全級(jí)比較高的代碼,比如讀寫文件等API或類庫,不允許在view當(dāng)中使用。這對(duì)于我們將模板開放出來,在線提供給我們的用戶去修改的需求下是非常重要的。而目前,不管WebForm還是Razor,都是非常自由的模板,在View能做的事情等同于Controller或其它地方所寫的代碼,這樣View就不允許開放出來由用戶在線修改。

  在相同的博文里面,還是那位讀者johngeng提到它更喜歡$而不是@,由于我之前并不了解NVelocity,所以我誤解為它是在說客戶端開發(fā)包jquery。現(xiàn)在看來,他說的應(yīng)該就是NVelocity,也許他覺得此人不可教,他并沒有直接回復(fù)我的疑問,這也只能怪自己知識(shí)面太窄了。

  若不是最近在為項(xiàng)目添加多模板引擎的支持,或許我永遠(yuǎn)也無法得到以上兩個(gè)問題的答案,而這兩個(gè)答案都與NVelocity有關(guān)。雖然我平常肯定也見過NVelocity這個(gè)詞,但到要選擇除WebForm以外的模板引擎,我還是完完全全沒有記起他,還是同事@浪子提醒我NVelocity這個(gè)模板引擎值得一試。看了官方的語法介紹后,我不得不說它是一種非常簡(jiǎn)潔且實(shí)用的模板,同時(shí)又不失它的靈活性和安全性。我所指的靈活性是它不像StringTemplate那樣,限制的那么死,連個(gè)對(duì)象的函數(shù)都不允許調(diào)用。安全性方面又可以滿足我希望模板上限制開發(fā)人員只能在模板上調(diào)用指定的API。到目前為止,NVelocity仍然讓我非常滿意。

  在ASP.NET MVC切換視圖引擎非常簡(jiǎn)單,在ASP.NET MVC1.0出來以后,MvcContrib就曾經(jīng)提供了多種視圖引擎的切換選擇,但是在最近的版本中,我卻始終沒有找到相關(guān)的代碼,應(yīng)該是這些代碼已經(jīng)被移出去了,但它的介紹文檔中還沒有刪掉相關(guān)的主題。還好在@重典童鞋的博客上找到了他從MvcContrib中提取出來的實(shí)現(xiàn)。但是這個(gè)實(shí)現(xiàn)相對(duì)于MVC3來說,已經(jīng)相對(duì)過時(shí)了,有些接口已經(jīng)改變或被移除了,比如IViewLocator這個(gè)接口就已經(jīng)不存在了。還有就是,它去掉了原先支持的調(diào)用HtmlHelper擴(kuò)展方法的功能,而我最重要的就是要支持?jǐn)U展函數(shù),因?yàn)槲易远x了一些必須的擴(kuò)展方法。下面我們就來看看NVelocity for ASP.NET MVC幾個(gè)類的詳細(xì)情況:

  NVelocityViewEngine

  在之前的實(shí)現(xiàn)中,直接實(shí)現(xiàn)了IViewEngine這個(gè)接口,查找View的路徑是通過實(shí)現(xiàn)IViewLocator來定位。在MVC2當(dāng)中,修改了這部分的實(shí)現(xiàn),MVC內(nèi)部提供了VirtualPathProviderViewEngine這個(gè)模板方法類,在子類當(dāng)中,我們中需要設(shè)置一下我們要查找的路徑格式,其它的事件就可以交給模板方法類來完成,這樣一方面可以簡(jiǎn)化我們的實(shí)現(xiàn),另一方面還可以和默認(rèn)的路徑查找方式統(tǒng)一。

  同時(shí),由于我使用Nvelocity內(nèi)置的相對(duì)文件路徑的方式來查找模板,而使用VirtualPath的風(fēng)格,因此在找到VirtualPath后,我們需要轉(zhuǎn)換成實(shí)際的物理路徑,直接通過物理路徑來加載模板內(nèi)容,而內(nèi)置的FileResourceLoader并不支持從物理路徑加載模板,所以我們還要額外實(shí)現(xiàn)一下FileResourceLoader,讓支持從物理路徑的加載方法。這兩個(gè)類的代碼如下:

public class FileResourceLoaderEx : FileResourceLoader
{
public FileResourceLoaderEx() : base() { }
private Stream FindTemplate(string filePath)
{
try
{
FileInfo file
= new FileInfo(filePath);
return new BufferedStream(file.OpenRead());
}
catch (Exception exception)
{
base.runtimeServices.Debug(string.Format("FileResourceLoader : {0}", exception.Message));
return null;
}
}
public override long GetLastModified(global::NVelocity.Runtime.Resource.Resource resource)
{
if (File.Exists(resource.Name))
{
FileInfo file
= new FileInfo(resource.Name);
return file.LastWriteTime.Ticks;
}
return base.GetLastModified(resource);
}
public override Stream GetResourceStream(string templateName)
{
if (File.Exists(templateName))
{
return FindTemplate(templateName);
}
return base.GetResourceStream(templateName);
}
public override bool IsSourceModified(global::NVelocity.Runtime.Resource.Resource resource)
{
if (File.Exists(resource.Name))
{
FileInfo file
= new FileInfo(resource.Name);
return (!file.Exists || (file.LastWriteTime.Ticks != resource.LastModified));
}
return base.IsSourceModified(resource);
}
}
public class NVelocityViewEngine : VirtualPathProviderViewEngine, IViewEngine
{
public static NVelocityViewEngine Default = null;

private static readonly IDictionary DEFAULT_PROPERTIES = new Hashtable();
private readonly VelocityEngine _engine;

static NVelocityViewEngine()
{
string targetViewFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "views");
//DEFAULT_PROPERTIES.Add(RuntimeConstants.RESOURCE_LOADER, "file");
DEFAULT_PROPERTIES.Add(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, targetViewFolder);
DEFAULT_PROPERTIES.Add(
"file.resource.loader.class", "NVelocityEngine.FileResourceLoaderEx//,NVelocityEngine");
Default
= new NVelocityViewEngine();
}
public NVelocityViewEngine()
:
this(DEFAULT_PROPERTIES)
{
}
public NVelocityViewEngine(IDictionary properties)
{
base.MasterLocationFormats = new string[] { "~/Views/{1}/{0}.vm", "~/Views/Shared/{0}.vm" };
base.AreaMasterLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.vm", "~/Areas/{2}/Views/Shared/{0}.vm" };
base.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.vm", "~/Views/Shared/{0}.vm" };
base.AreaViewLocationFormats = new string[] { "~/Areas/{2}/Views/{1}/{0}.vm", "~/Areas/{2}/Views/Shared/{0}.vm" };
base.PartialViewLocationFormats = base.ViewLocationFormats;
base.AreaPartialViewLocationFormats = base.AreaViewLocationFormats;
base.FileExtensions = new string[] { "vm" };
if (properties == null) properties = DEFAULT_PROPERTIES;

ExtendedProperties props
= new ExtendedProperties();
foreach (string key in properties.Keys)
{
props.AddProperty(key, properties[key]);
}

_engine
= new VelocityEngine();
_engine.Init(props);
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
Template viewTemplate
= GetTemplate(viewPath);
Template masterTemplate
= GetTemplate(masterPath);
NVelocityView view
= new NVelocityView(controllerContext, viewTemplate, masterTemplate);
return view;
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
Template viewTemplate
= GetTemplate(partialPath);
NVelocityView view
= new NVelocityView(controllerContext, viewTemplate, null);
return view;
}
public Template GetTemplate(string viewPath)
{
if (string.IsNullOrEmpty(viewPath))
{
return null;
}
return _engine.GetTemplate(System.Web.Hosting.HostingEnvironment.MapPath(viewPath));
}
}

NET技術(shù)NVelocity for ASP.NET MVC,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品久久一区一区 | 亚洲一区二区影视 | 亚洲一二三区久久五月天婷婷 | 国产精品久久一区一区 | 99在线观看视频免费精品9 | 韩国一级网站 | 激情综合网五月激情 | 四虎永久在线日韩精品观看 | 99国产精品免费视频观看 | 国产日本一区二区三区 | 日本一区二区三区在线 视频 | 四虎影视国产精品永久在线 | 精品一区二区三区波多野结衣 | 欧美黄色片在线观看 | 五月婷婷久 | 日韩激情视频在线观看 | 午夜视频在线免费 | 亚洲图片欧美日韩 | 久久99精品国产99久久 | 91国内揄拍·国内精品对白 | 婷婷久月| 久久精品国产99国产精品 | 国产日韩精品欧美在线ccc | 成人sese| 欧美黑人两根巨大挤入 | 国内精品91最新在线观看 | 五月天999| 色啦啦 | 欧美一级欧美一级高清 | 酒色成人网 | 国产福利在线视频 | 色视频在线观看视频 | 国产精品热久久毛片 | 国产人成精品综合欧美成人 | 思思久久这里只精品99re66 | 伊人99综合| 女人国产香蕉久久精品 | 国产成人系列 | 亚洲第一福利视频 | 国产成人在线视频 | 亚洲十欧美十日韩十国产 |