教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
相信大家都试过在一个View里嵌套使用javascript,这时就可以直接使用Razor语法以调用.NET的一些方法。如以下代码嵌套在一个Razor的View里:
<script> varcurrDate='@DateTime.Now';//直接调用.NET的方法 console.log(currDate) </script>
但另一种情况是,如果我想在一个独立的JS文件里使用Razor,那以上的方法可行不通,因为MVC不会直接解释JS文件,只有放到Razorview里才可以。不过在此我向大家推荐一个第三方类库,就可让你直接在独立的JS文件里使用Razor
此类库名字就叫RazorJS,这是一个开源的项目,可到以下地址下载源码:
https://bitbucket.org/djsolid/razorjs
或者也可以直接通过Nuget进行安装:
PM>Install-PackageRazorJS
OK,先说说这个类库能为我们带来什么吧。安装后你可以直接在JS文件里使用所有.NET支持的方法,如上面的代码就可以直接放到独立的JS文件里去使用。另外你还可以在JS文件里引用.NET的全名空间,如要调用File对象来读取文本文件内容,就可以直接引用System.IO命名空间:
@usingSystem.IO; vars='Helloat@DateTime.Now\n@File.ReadAllText(System.Web.Hosting.HostingEnvironment.MapPath("~/web.config"))';
运行后就可直接在JS里获取到web.config文件里的所有内容。看样子挺不错吧,呵呵。那到底此类库是如何运作的呢?其实它是使用了一个叫RazorEngine的类库达到以上效果的。RazorEngine是一个Razor的解释引擎,其功能非常强大,我之前也在一些项目中使用过。通过此引擎,你甚至可以直接在winform中使用Razor语法,呵,不知你有没想到其好处了?
嗯,不错,有了此引擎,就可以完全独立了web环境去使用MVC的Razor,这个功能可让你非常方便地制定一些灵活的模板,如一些email模板,你可直接在模板里使用各种.NET方法甚至自定义的对象,然后动态生成想要的内容。OK,但这个引擎并不是这次我要介绍的东西,在此只是顺便说说啦
接下来说一个RazorJS的使用方法,如果你是直接通过Nuget安装的,那么就会自动帮你配置好web.config,这是建议的安装方法,否则你就要自己添加web.config里的配置了,有好几处地方,这里也不详说,大家安装了后可对比一下就知道了。要使用RazorJS也很简单,只需使用以下语法引用你要的JS文件就可以了:
<p> @Html.RazorJSInline("~/Scripts/Example.js") </p>
不过要注意一点的是,在你的web.config里会有一段配置允许RazorJS使用的目录,就是说你的JS文件必须放到此目录里才可以使用此方法来引用:
<razorJSSettingshandlerPath="~/razorjs.axd"> <allowedPaths> <addpath="~/Scripts"/> </allowedPaths> </razorJSSettings>
最后要说一下的是其限制。有好的地方当然也有不好的一面,由于其使用的是RazorEngine,所以你不可以在JS里使用MVC的HTMLHelper方法,即所有@Html开头的方法。另一个问题就是其不能识别JS里的注释代码,就是说如果你在注释里使用了.NET的方法也一样会执行,如果你的方法正确就没问题,否则就会中断JS的执行直接报错了,所以不要以为没用的方法注释掉就可以了哦。
关于不能执行@Htmlhelper的问题,我这里提供另一个解决办法,不过这就可修改其源代码,想折腾的朋友可以试试。其实这样做也可以使用很多自定义的方法,更加灵活方便哦。下载了RazorJS源码后,你可直接在上面修改然后重新编译一个DLL出来,另一种方法就是将其源码当作另一个项目,直接加到你自己的项目中去。
在其源码中,打开HtmlTemplateBase.cs文件,你就可在此添加自己的方法了,然后在这里添加的方法都可直接在JS里调用。如在源码中你可发现已封装的一个Href方法,可将URL转换为在请求客户端可用的URL。根据此写法,我们就可添加自己的方法,如以下是我封装一个动态获取国际化资源文件的方法,这样就可直接在JS里使用.NET的资源文件进行国际化了:
publicclassHtmlTemplateBase:TemplateBase { //手工调用资源文件管理器 privatestaticResourceManagerresources=(ResourceManager)System.Type.GetType ("RazorJS.Resource").GetProperty("ResourceManager").GetValue(null,null); publicHtmlTemplateBase() { Url=newUrlHelper(HttpContext.Current.Request.RequestContext); } publicstringHref(stringoriginalUrl) { returnExtensions.ResolveUrl(originalUrl); } publicstringGetLangText(stringlangKey) { 根据key返回相关的语言 returnresources.GetString(langKey); } publicUrlHelperUrl{get;set;} }
然后在JS里直接调用即可:
vars='@GetLangText("CoderBlog")'; console.log(s);
运行完后,就可直接在JS里输入CoderBlog这个key的内容啦