MVC4 Razor对括号感到困惑

Dav*_*kle 10 asp.net-mvc razor asp.net-mvc-4

对于那里的所有剃刀专家,我有一个相当简单的问题.我正在尝试对URL进行jQuery $ .ajax()调用,使用Url.Content()将home相对路径转换为根相对路径.在这样做的过程中,Razor对@section的结尾位置感到有些困惑.我希望能够指定内联URL,但是当我这样做时,Razor认为$ .ajax()参数列表的结尾是我@section的结尾.我正在使用@section,因为我想使用布局将我的javascript放在每个文件的底部.Razor为何如此困惑?我甚至尝试使用@(Url.Content(...)),但这也不起作用.

此外,这是解决问题的最佳方法吗?我正在使用ASP.NET MVC 4 Preview.

这有效:

@section Scripts {
    <script type="text/javascript">        
        var getMessagesUrl = '@Url.Content("~/Logging/GetMessages")';

        $(document).ready(function () {
            $.ajax({
                url: getMessagesUrl,
                dataType: 'html',
                success: function (result) {
                    $('tbody').html(result);
                }
            });
        });
    </script>
}
Run Code Online (Sandbox Code Playgroud)

这不是:

@section Scripts {
    <script type="text/javascript">        
        $(document).ready(function () {
            $.ajax({
                url: '@Url.Content("~/Logging/GetMessages")',
                dataType: 'html',
                success: function (result) {
                    $('tbody').html(result);
                }
            }); //Razor thinks this is the curly-brace that ends the section!
        });
    </script>
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ott 9

这可能取决于解析器的行为.当它遇到@符号时,解析器切换到代码模式并将读取隐式表达式Url.Content("~/Logging.GetMessages")(实际上,它将读取直到'符号,确定它不是表达式中的有效字符和引用返回直到结束).它是在此阶段之后,解析器与您的视图有点混淆,因为它可能在遇到最终}字符时处于代码模式,并认为它是代码范围的结束.

实际情况是,在使用C#在剃刀视图中使用javascript时必须非常小心.转换到代码是显式的,例如@在a之后{,但是转换到标记有点难以确定.

除了Razor之外,我的建议是将你的javascript应用程序代码粘贴到外部文件中,并利用data-*属性将元信息传递给你的应用程序代码,例如:

<script id="messageScript" type="text/javascript"
    src="/Scripts/messages.js" 
    data-messages="@Url.Content("~/Logging/GetMessages")"></script>
Run Code Online (Sandbox Code Playgroud)

你可以访问哪些:

(function($) {

    $(function() {
        var $this = $("#messageScript");
        $.ajax({
            url: $this.attr("data-messages"),
            type: "html",
            success: function(result) {
                $("tbody").html(result);
            }
        });
    });

})(window.jQuery);
Run Code Online (Sandbox Code Playgroud)


Dav*_*kle -1

感谢大家的帮助。

看来它一定是 ASP.NET MVC 4 Preview 中的一个错误。我刚刚升级到 2 月 15 日发布的 ASP.NET MVC 4 Beta,现在问题完全消失了。