混合 Razor 和 Javascript 代码

IT技术 c# javascript razor
2021-02-03 21:24:53

我对如何混合 razor 和 js 感到很困惑。这是我坚持使用的当前功能:

<script type="text/javascript">

        var data = [];

        @foreach (var r in Model.rows)
        {
                data.push([ @r.UnixTime * 1000, @r.Value ]);
        }

如果我可以声明 c# 代码,<c#></c#>而其他一切都是 JS 代码——这就是我所追求的:

<script type="text/javascript">

        var data = [];

        <c#>@foreach (var r in Model.rows) {</c#>
                data.push([ <c#>@r.UnixTime</c#> * 1000, <c#>@r.Value</c#> ]);
        <c#>}</c#>

实现这一目标的最佳方法是什么?

6个回答

使用<text>

<script type="text/javascript">

   var data = [];

   @foreach (var r in Model.rows)
   {
      <text>
            data.push([ @r.UnixTime * 1000, @r.Value ]);
      </text>
   }
</script>
如果此代码在一个包中呢?我可以在 javascript 文件中编写代码吗?
2021-03-13 21:24:53
Razor 在执行时在 Javascript 块中工作正常,但我讨厌语法突出显示如何变得各种混乱。它将所有 Razor 代码突出显示为无效语法,因为我相信它停留在 Javascript 模式。
2021-03-24 21:24:53
@ncubica 如果你想要捆绑剃须刀,而不是你的概念有问题。Razor 用于视图,而不是 javascript。
2021-03-25 21:24:53
@ncubica 这篇文章很旧,但您问题的解决方案是:在 JS 文件中编写一个函数,用 渲染它Scripts.Render,然后在<script>标签中调用该函数不完全优雅,但它适用于大多数(阅读:简单)用例。
2021-03-25 21:24:53
完美运行,直到您想检查一个变量是否小于另一个变量并且剃刀变精神病!
2021-03-26 21:24:53

里面一个代码块(例如,@foreach),你需要标记标记(或者,在这种情况下,JavaScript)的使用@:<text>标签

在标记上下文中,您需要用代码块(@{ ... }@if, ...)

你为什么说“标记标记”,如果内容实际上是标记,这将不是问题。
2021-03-25 21:24:53
@: 正是我要找的,太棒了!
2021-03-30 21:24:53
@Max:尽管它看起来不像标记,但它是标记。(与服务器端代码相反)
2021-04-09 21:24:53

你也可以简单地使用

<script type="text/javascript">

   var data = [];

   @foreach (var r in Model.rows)
   {
       @:data.push([ @r.UnixTime * 1000, @r.Value ]);
   }
</script>

注意@:

永远不要混合更多的语言。

<script type="text/javascript">
    var data = @Json.Encode(Model); // !!!! export data !!!!

    for(var prop in data){
      console.log( prop + " "+ data[prop]);
    }

如果出现问题,您也可以尝试

@Html.Raw(Json.Encode(Model));
它返回Uncaught SyntaxError: Unexpected token &是因为模型变成了这样[{&quot;Id&quot;:1,&quot;Name&quot;:&quot;Name}]
2021-03-12 21:24:53
请注意,这混合语言。您有一个半 JavaScript ("var data = ") 和半 Razor/C# ("@Json.Encode(Model)") 的语句。这只是一种侵入性较小的混合,但它的混合程度不亚于拥有一个身体发出生成的 JavaScript 的 Razor/C#“foreach”。:-)
2021-03-28 21:24:53
这是最好和最简单的解决方案。绝对需要通过 Html.Raw() 提供编码的 JSON 以摆脱&quot;实体。
2021-04-02 21:24:53
这很好,但也有我们需要混合的合法实例。但这是我使用的解决方案,因为它非常适合。
2021-04-10 21:24:53

一种将 javascript 与视图分离但仍然在其中使用 razor 的非常规方法是创建一个Scripts.cshtml文件并将混合的 javascript/razor 放在那里。

索引.cshtml

<div id="Result">
</div>

<button id="btnLoad">Click me</button>

@section scripts
{
    @Html.Partial("Scripts")
}

脚本.cshtml

<script type="text/javascript">
    var url = "@Url.Action("Index", "Home")";

    $(document).ready(function() {
        $("#btnLoad").click(function() {
            $.ajax({
                type: "POST",
                url: url ,
                data: {someParameter: "some value"},
                contentType: "application/json; charset=utf-8",
                dataType: "json",

                success: function(msg) {
                    $("#Result").text(msg.d);
                }
            });
        });
    });
</script>