中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

NVelocity for ASP.NET MVC

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

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

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

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

  NVelocityViewEngine

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

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

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)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 成人毛片视频免费 | 免费看的黄网站 | 亚洲精品一区二区三区四区高清 | 欧美一级在线观看 | 中文字幕一区二区三区四区五区 | 日韩欧美国产不卡 | 久久91精品国产一区二区 | 亚洲 欧美 另类 综合 偷拍 | 精品欧美乱码久久久久久 | 久久久久久中文字幕 | 国产午夜影院 | 91精品国产91久久久久久吃药 | 激情欧美日韩一区二区 | 欧美视频二区 | 亚洲综合精品 | 亚洲码欧美码一区二区三区 | 99热这里都是精品 | 毛片在线看片 | 久久久久电影 | 日韩成人免费在线视频 | 久久人人爽人人爽人人片av免费 | 国产精品视频一二三区 | 国产美女视频黄a视频免费 国产精品福利视频 | 蜜桃精品视频在线 | 欧美成人在线免费 | 黄色国产视频 | 久久久免费精品 | 国产一区二区精品在线 | 精品国产一区二区在线 | 亚洲欧美激情精品一区二区 | 特级黄一级播放 | 亚洲精品久久久久久下一站 | 国产日韩久久 | 成人午夜精品 | 日本午夜免费福利视频 | 欧美性大战久久久久久久蜜臀 | 看片wwwwwwwwwww| 亚洲精品一区二区久 | 国产免费拔擦拔擦8x高清 | 天堂一区二区三区 | 久久精品国产亚洲 |