您好,欢迎访问一九零五行业门户网

教你如何在 Javascript 文件里使用 .Net MVC Razor 语法_javascript技巧

相信大家都试过在一个 view 里嵌套使用 javascript,这时就可以直接使用 razor 语法以调用 .net 的一些方法。如以下代码嵌套在一个 razor 的 view 里:

但另一种情况是,如果我想在一个独立的 js 文件里使用 razor,那以上的方法可行不通,因为mvc不会直接解释js文件,只有放到 razor view里才可以。不过在此我向大家推荐一个第三方类库,就可让你直接在独立的 js 文件里使用 razor
此类库名字就叫 razorjs,这是一个开源的项目,可到以下地址下载源码:
https://bitbucket.org/djsolid/razorjs
或者也可以直接通过nuget进行安装:
pm> install-package razorjs
ok,先说说这个类库能为我们带来什么吧。安装后你可以直接在 js 文件里使用所有 .net 支持的方法,如上面的代码就可以直接放到独立的js文件里去使用。另外你还可以在js文件里引用.net的全名空间,如要调用 file 对象来读取文本文件内容,就可以直接引用 system.io 命名空间:
@using system.io; var s = 'hello at @datetime.now \n @file.readalltext(system.web.hosting.hostingenvironment.mappath(~/web.config))';
运行后就可直接在 js 里获取到 web.config 文件里的所有内容。看样子挺不错吧,呵呵。那到底此类库是如何运作的呢?其实它是使用了一个叫 razorengine 的类库达到以上效果的。razorengine 是一个 razor 的解释引擎,其功能非常强大,我之前也在一些项目中使用过。通过此引擎,你甚至可以直接在 win form 中使用 razor 语法,呵,不知你有没想到其好处了?
嗯,不错,有了此引擎,就可以完全独立了 web 环境去使用 mvc 的 razor ,这个功能可让你非常方便地制定一些灵活的模板,如一些 email 模板,你可直接在模板里使用各种.net 方法甚至自定义的对象,然后动态生成想要的内容。ok,但这个引擎并不是这次我要介绍的东西,在此只是顺便说说啦
接下来说一个 razorjs 的使用方法,如果你是直接通过 nuget 安装的,那么就会自动帮你配置好 web.config,这是建议的安装方法,否则你就要自己添加 web.config 里的配置了,有好几处地方,这里也不详说,大家安装了后可对比一下就知道了。要使用 razorjs 也很简单,只需使用以下语法引用你要的 js 文件就可以了:
@html.razorjsinline(~/scripts/example.js)

不过要注意一点的是,在你的 web.config 里会有一段配置允许 razorjs 使用的目录,就是说你的js文件必须放到此目录里才可以使用此方法来引用:

最后要说一下的是其限制。有好的地方当然也有不好的一面,由于其使用的是 razorengine ,所以你不可以在 js 里使用 mvc 的 html helper 方法,即所有 @html 开头的方法。另一个问题就是其不能识别 js 里的注释代码,就是说如果你在注释里使用了 .net 的方法也一样会执行,如果你的方法正确就没问题,否则就会中断 js 的执行直接报错了,所以不要以为没用的方法注释掉就可以了哦。
关于不能执行 @html helper的问题,我这里提供另一个解决办法,不过这就可修改其源代码,想折腾的朋友可以试试。其实这样做也可以使用很多自定义的方法,更加灵活方便哦。下载了 razorjs 源码后,你可直接在上面修改然后重新编译一个dll出来,另一种方法就是将其源码当作另一个项目,直接加到你自己的项目中去。
在其源码中,打开 htmltemplatebase.cs 文件,你就可在此添加自己的方法了,然后在这里添加的方法都可直接在 js 里调用。如在源码中你可发现已封装的一个 href 方法,可将 url 转换为在请求客户端可用的 url。根据此写法,我们就可添加自己的方法,如以下是我封装一个动态获取国际化资源文件的方法,这样就可直接在js里使用.net的资源文件进行国际化了:
public class htmltemplatebase : templatebase { //手工调用资源文件管理器 private static resourcemanager resources = (resourcemanager)system.type.gettype (razorjs.resource).getproperty(resourcemanager).getvalue(null, null); public htmltemplatebase() { url = new urlhelper(httpcontext.current.request.requestcontext); } public string href(string originalurl) { return extensions.resolveurl(originalurl); } public string getlangtext(string langkey) { 根据key返回相关的语言 return resources.getstring(langkey); } public urlhelper url { get; set; } }
然后在js里直接调用即可:
var s = '@getlangtext(coderblog)';console.log(s);
运行完后,就可直接在js里输入 coderblog 这个key的内容啦
其它类似信息

推荐信息