使用&lt;%= code%&gt;嵌入C#代码在javascript <script>标签</script>中

时间:2009-11-14 22:41:25

标签: javascript asp.net-mvc model embed

我正在使用ASP.NET MVC,并希望在我的javascript中获取模型信息。我强烈输入了视图,因此可以在HTML中使用<%= Model.Name %>来获取模型数据。

但是一旦我在<script>标签中,当使用&lt;%时,我得不到intellisense(在Visual Studio中),并且信息似乎没有正确呈现。我是否缺少能够在Javascript中使用尖括号方案的东西?

感谢。

澄清:我应该发布我第一次尝试使用的代码。为了详细说明,我正在尝试使用JQuery的$ .getJSON从Model中获取数据(通过Controller),并填充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()的方法,这是一种耻辱,因为我认为这是更好的方法。但是&lt;%标签现在肯定是渲染数据。我猜它只是在没有intellisense的时候扔给我,而且他们并没有像正常那样突出。感谢您的快速回复。对于上面第一个选项的正确格式的任何想法?

5 个答案:

答案 0 :(得分:2)

一般来说,&lt;%=%&gt;块只能在Javascript中的引号内使用。因为你在引用的文本中,Intellisense可能无法正常工作。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

在将字符串写入脚本标记时需要小心,因为它是javascript,期望字符串具有正确编码的特殊字符。此外,如果该字符串包含类似“&lt; / script&gt;”的内容你冒着浏览器没有运行javascript早期结束脚本块的风险。

编码字符串的简单方法是使用JSON序列化程序,也许是JavaScriptSerializer()。

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

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

这样做的一个副作用是&lt;%=%&gt;表达式不在引号内,这听起来有助于您的原始自动完成支持发布。请注意,Serialize()不仅会正确转义javascript的字符串,还会对'&lt;'进行转义编码和'&gt;'字符,以便“&lt; / script&gt;”场景不可能发生。

答案 3 :(得分:1)

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

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

不应该是这样的吗?

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

注意 new {ID = Model.ID}

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

答案 4 :(得分:0)

您可以尝试使用单引号:

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