如何在Coffeescript文件中使用Razor表达式?

时间:2011-09-23 18:40:59

标签: asp.net-mvc razor coffeescript

我想在CoffeeScript中执行类似的操作,以便将所有脚本移到coffe文件中:

$("#btnFinish").click ->
    $.post "@Url.Action("Submit", "Process")", (response) ->
        $("#PlaceHolderButton")
            .button()
            .text response

$("#btnHome").click -> 
    window.location.href='@Url.Action("Index","Home")'

我应该将我需要的url和其他项目推送到隐藏值中,并在脚本运行时查询它们以供日后使用吗?

我觉得我错过了一个关键概念或其他东西。

2 个答案:

答案 0 :(得分:3)

尽量避免将javascript与服务器端混合使用。总有更好的解决方法。例如:

@Html.ActionLink("Some button", "Submit", "Process", null, new { id = "btnFinish" })

然后在你的js:

$('#btnFinish').click(function() {
    $.post(this.href, function(response) {
        ...
    });
    return false;
});

或者如果btnFinish是某个div,您无法使用帮助程序生成网址,则可以使用HTML5 data- *属性,如下所示:

<div id="btnFinish" data-url="@Url.Action("Submit", "Process")">Some button</div>

然后:

$('#btnFinish').click(function() {
    var url = $(this).data(url);       
    $.post(url, function(response) {
        ...
    });
    return false;
});

但是如果你有一些AJAXify的可点击按钮,那么第一种方法在语义上会更好,因为你直接将url作为href的一部分。

同样的事情适用于你的第二个例子:

$('#btnHome').click(function() {
    window.location.href = $(this).data('url');
});

因此,您的javascript文件中不再需要任何服务器端标记。您的js是完全静态的,组合的,缩小的,gzip压缩的,缓存的,从内容交付网络提供的服务以及与此相关的所有好处。

答案 1 :(得分:0)

要将Razor直接嵌入到JavaScript中,您需要JavaScript才能通过Razor视图引擎进行评估,然后再将其传递给浏览器。这种情况目前尚未发生,但可以做到。

我用这些方法解决了这个问题:   - 隐藏的现场方法   - 视图中的<script type="text/javascript>...</script>

您可以使用最后一个方法并创建一个配置管理插件,该插件将接收视图中的键值,并提供从视图外部的JavaScript查询它们的方法。

还有Nuz上可用的RazorJS:

http://nuget.org/List/Packages/RazorJS

  

写Razor-Style C#或VB.NET insde你的Javascript文件。还包含一个http处理程序,用于在需要时提供这些文件。