2009-11-14 112 views
2

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

但是,一旦我在<script>标记中,当使用<%时,我不会收到intellisense(在Visual Studio中),并且信息似乎无法正确呈现。有没有什么我能够在Javascript中使用尖括号方案?

谢谢。

CLARIFICATION:我应该发布我第一次尝试使用的代码。为了详细阐述一下,我试图使用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()的方法,这是一个耻辱,因为我认为这是更好的方法。但是<%标签现在肯定会呈现数据。我猜这只是在没有智能感觉的时候扔给我,而且他们没有像正常人那样突出显示。感谢您的快速回复。有关上述第一个选项的正确格式的任何想法?

+1

发布一些代码。没有什么能阻止你在JavaScript里面使用<%=%>。 2008年没有智能支持(不知道他们是否在2010年解决了这个问题)。没有代码示例,就没有办法提供帮助。 –

+0

张贴在帖子编辑中的代码。 –

回答

2

一般来说,<%=%>块应该只能在Javascript中使用引号。由于您在引用文本中,因此Intellisense可能无法正常工作。

2

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

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

0

你可以尝试单引号:

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

您需要将字符串写入到脚本标记时要小心,因为它是JavaScript中的预期是,该字符串有正确编码的特殊字符。此外,如果该字符串包含“</script>”之类的字词,则可能会导致未运行JavaScript的浏览器提早结束脚本块。

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

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

我觉得这样比较安全。你想把这段代码放在一个辅助函数中,我只是在那里实例化JavaScriptSerializer(),所以它是最简单的例子。

这样做的一个副作用是<%=%>表达式不在引号内,这听起来像会帮助您的原始自动完成支持发布。请注意,Serialize()不仅会正确地转义javascript字符串,还会对'<'和'>'字符进行转义编码,以避免发生“</script>”情形。

1

纠正我,如果我错了,但我从来没有见过Url.Action像这样使用:

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

它不应该是这样吗?

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

新{ID = Model.ID}

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

相关问题