JavaScript中的Razor语法

3

考虑一下JavaScript中的这个Razor语法:

@{
   int badgeCount = ViewBag.badgeCount;
 }

<script type="text/javascript">
    for (var i = 0; i < @badgeCount; i++) {
        TrackWonBadge('@CurrentMember.Name');
    }
</script>

我试图在循环中使用徽章计数,但出现了语法错误。

2个回答

6
你应该选择像这样的东西:
<script type="text/javascript">
    var badgeCount = Number('@ViewBag.badgeCount');

    for (var i = 0; i < badgeCount; i++) {
        TrackWonBadge('@CurrentMember.Name');
    }
</script>

2

我认为更好的方法是尽量减少动态JavaScript的使用。以下代码会更有效:

@{
    int badgeCount = ViewBag.badgeCount;
    string memberName = "Some Name";
}

<input type="hidden" id="BadgeCount" value="@badgeCount" />
<input type="hidden" id="MemberName" value="@memberName" />

<script type="text/javascript">
    var badgeCount = document.getElementById('BadgeCount').value;
    var memberName = document.getElementById('MemberName').value;
    for (var i = 0; i < badgeCount; i++) {
        TrackWonBadge(memberName);
    }
</script>

这样做的好处是,如果您的脚本变得更加复杂,您就可以将其迁移到独立的文件中。

事实上,我不会在内联方式下构建脚本。我会将其移动到单独的 .js 文件中,以便将客户端的标记与逻辑分离开来。这类似于ASP.NET MVC在服务器端强制要求您执行的操作;您的视图使用与控制器不同的语言,因此位于单独的文件中。即使您现在不想执行这种文件分离操作,编写动态JavaScript会让这种最终的分离在您的代码进入生产和维护阶段时更加困难。


3
创建两个无用的隐藏输入框我看不出有什么好处。 - gdoron
我也是,我同意gdoron的观点。 - Serkan Yılmaz
这将会把你的HTML与JavaScript分开,这本身就是一个很好的实践。你可以把JavaScript移动到它自己的文件中。这将把你的视图和逻辑分开。这也是为什么在经典ASP.NET中你要使用code-behind文件,而不是在.aspx文件中用<script runat="server">标签编写C#的原因相同。但最终还是要看你自己。 - Katie Kilian
你的回答不够清晰。我同意你应该将脚本移动到它自己的文件中,那么为什么你在这里编写内联脚本呢?另一件事:你给隐藏字段设置了名称,但却试图通过ID获取它们。 - Zabavsky
你关于名称和ID的观点是完全正确的。至于另一个问题,我只能引用自己的话:"这样做的好处是如果你的脚本变得更加复杂,你仍然可以将其迁移到自己的文件中。"基本上,我试图在没有让他完全重写代码的情况下,引导OP朝着正确的方向前进。我尽可能使用他的代码来使示例更易读。 - Katie Kilian
@Zabavsky:我进行了编辑,以使我的意图更清晰。感谢您的建设性批评。 - Katie Kilian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接