从控制器返回剃刀解析的Javascript作为ViewResult

时间:2011-03-07 13:43:21

标签: asp.net asp.net-mvc-3 razor

我已经成功创建了一个mvc / razor Web应用程序,它返回已经被razor解析的css文件。每次有背景图像时,我都有一个剃刀片段,它将URL前缀写入图像文件名。 CSS现在看起来像这样:

body { background-image: url(@LookupUrl.Image("background.gif")); }

Css文件现在工作正常,我已经开始试图让javascript .js文件以相同的方式运行,但这些不是在玩球。

代码与css代码相同,并且它成功找到.js文件,但是razor似乎以不同方式解析它。这是一个js文件示例:

function testFunction() { alert('test function hit!'); }
testFunction();

Razor似乎认为它应该编译它的代码,并给出错误:

Compiler Error Message: JS1135: Variable 'alert' has not been declared

    > Source Error:
    > 
    > Line 1:  function testFunction() {
    > Line 2:      alert('test function
    > hit!'); Line 3:  } Line 4: 
    > testFunction();

将同一文件重命名为.css后,它可以正常工作。

有没有办法让razor以与.css相同的方式使用.js文件?

以下是我为razor注册文件处理程序的方法:

RazorCodeLanguage.Languages.Add("js", new CSharpRazorCodeLanguage());
RazorCodeLanguage.Languages.Add("css", new CSharpRazorCodeLanguage());

WebPageHttpHandler.RegisterExtension(".js");
WebPageHttpHandler.RegisterExtension(".css");

构建提供程序通过his blog post中的Haacked大纲方法在PreApplicationStart中注册。

我是否需要删除mvc为.js文件添加的处理程序?

上更新2天

当我开始工作时,我不想向其他人推荐这种方法。使用Razor解析css / javascript是有缺陷的,不使用< text>< text /> - 使用@&ampersand剃刀的简单性让它变得混乱。考虑一下CSS3 @ font-face。 Razor击中@并认为它应该将它用作函数。 javascript也会发生同样的事情,Jquery 1.5.1就是这样。

相反,我可能会回到动态css / javascript的aspx webforms,其中< %%>的可能性较小。代码块自然出现。

3 个答案:

答案 0 :(得分:3)

我无法理解为什么CSS工作而JS没有,特别是在CSS文件中复制+粘贴的JS代码之后。

我在System.Web.WebPages.Razor源代码中使用visual studio中的find / replace对话框来搜索项目中的字符串'.js'。没有任何帮助,所以我去了System.Web.WebPages项目。它在System.Web.WebPages.Util中找到了一个匹配项,它是一个带有一些辅助方法的静态类。

其中一种方法是'EnsureValidPageType',并且有一个try / catch块。在'catch'区块内是一条评论:

// If the path uses an extension registered with codedom, such as Foo.js,
// then an unfriendly compilation error might get thrown by the underlying compiler.
// Check if this is the case and throw a simpler error.

这让我相信.js有一些特殊的内置处理程序。

我google了一下,找不到任何东西,然后查看了\ Windows \ Microsoft.NET \ Framework64 {version} \ Config中的web.config。

有一个buildProvider映射,扩展名为.js到

System.Web.Compilation.ForceCopyBuildProvider

在网站的web.config中删除此buildprovider之后,.js文件会被编译并按预期工作!

我仍然不太确定ForceCopyBuildProvider的功能或用途,但我想知道它是否适用于visual studio。各种扩展具有不同的复制/忽略构建提供程序注册。

再次为回答我自己的问题道歉,但我希望全面的(waffley)答案可以帮助其他人。

答案 1 :(得分:2)

您可以尝试使用特殊的<text>节点来指示Razor解析器按字面意思处理内容:

<text>
    function testFunction() { alert('test function hit!'); }
    testFunction();
</text>

答案 2 :(得分:1)

默认的Razor解析器使用HtmlMarkupParser来处理模板的标记组件。目前没有任何支持其他标记语言的替代解析器(您需要将javascript代码语言视为)。如果您确实创建了一个新的标记解析器,我认为将代码和标记(即C#和Javascript)分开是非常困难的。

您可以做的是,在到达模板的该部分时,使用<text></text>包装元素强制解析器切换到标记模式,例如

<text>function testFunction() { alert('test function hit!'); }</text>

它不漂亮,但它应该可以解决问题。