【问题标题】:Embedding C# code using <%= code %> within javascript <script> tags在 javascript <script> 标签中使用 <%= code %> 嵌入 C# 代码
【发布时间】:2009-11-15 09:44:50
【问题描述】:

我正在使用 ASP.NET MVC,并希望获取模型信息以在我的 javascript 中使用。我已经强烈键入视图,因此能够在我的 HTML 中使用&lt;%= Model.Name %&gt; 来获取模型数据。

但是一旦我进入&lt;script&gt; 标签,在使用

谢谢。

澄清:我应该发布我第一次尝试使用的代码。为了详细说明,我正在尝试使用 JQuery 的 $.getJSON 从模型(通过控制器)获取数据,并填充一个 JSON 对象。我正在使用的javascript如下:

    <script type="text/javascript">
    $(document).ready(function() {
        $.getJSON("<%=Url.Action("PopulateJournalOptions", "Evaluation", Model.ID) %>", populateJSON);
    });
</script>

PopulateJournalOptions 是我的控制器操作,评估是我的控制器名称,而 Model.ID 是我要传递给它的内容。顺便说一句,我应该能够使用:

<script type="text/javascript">
    $(document).ready(function() {
        $.getJSON("/Evaluation/PopulateJournalOptions/<%= Model.ID %>", populateJSON);
    });
</script>

但即使在这里,我也不确定是否正确使用了这些尖括号。它肯定看起来有点不对劲。感谢您的帮助。

UDPATE: 继续尝试上面的第二种方法,它确实有效。我仍然无法使用使用 Url.Action() 的第一种方法,这很遗憾,因为我认为这是更好的方法。但是

【问题讨论】:

  • 发布一些代码。没有什么能阻止你在 javascript 中使用 。 2008 年没有智能感知支持(不确定他们是否在 2010 年修复了这个问题)。没有代码示例,就无法提供帮助。

标签: javascript asp.net-mvc model embed


【解决方案1】:

一般来说, 块只能在 Javascript 中的引号内使用。因为您在引用的文本中,所以 Intellisense 可能无法工作。

【讨论】:

    【解决方案2】:

    它应该可以工作 - 你的 C# 应该在 JavaScript 执行客户端之前执行服务器端。 Intellisense 可能只是被上下文混淆了。

    我有时会在 PHP 和 JavaScript 中使用这种技术。

    【讨论】:

      【解决方案3】:

      将字符串写入脚本标签时需要小心,因为它是 javascript,期望字符串具有正确编码的特殊字符。此外,如果该字符串包含“”之类的内容,则可能会导致未运行 javascript 的浏览器提前结束脚本块。

      对字符串进行编码的一种简单方法是使用 JSON 序列化程序,可能是 JavaScriptSerializer()。

      <script>
          var targetUrl = <%= (new JavaScriptSerializer()).Serialize("http://url/") %>;
      </script>
      

      我认为这样更安全。你想把这段代码放在一个辅助函数中,我只是在原地实例化 JavaScriptSerializer() 所以它是最简单的例子。

      这样做的一个副作用是 表达式不在引号内,这听起来有助于您原来的自动完成支持问题。请注意,Serialize() 不仅会正确地转义 javascript 的字符串,它还会对 '' 字符进行转义编码,这样“”的情况就不会发生。

      【讨论】:

        【解决方案4】:

        如果我错了,请纠正我,但我从未见过这样使用 Url.Action:

        <%= Url.Action("PopulateJournalOptions", "Evaluation", Model.ID) %>
        

        不应该这样吗?

        <%= Url.Action("PopulateJournalOptions", "Evaluation", new { ID = Model.ID } ) %>
        

        注意新的 { ID = Model.ID }

        Url.Action 使用对象属性的反射来确定路由值是什么。由于 int 对象没有字段/属性,因此它不会检测到任何内容。

        【讨论】:

          【解决方案5】:

          你可以试试单引号:

          $.getJSON('<%=Url.Action("PopulateJournalOptions", "Evaluation", Model.ID) %>', populateJSON);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-24
            • 1970-01-01
            • 1970-01-01
            • 2015-06-07
            相关资源
            最近更新 更多