在MVC框架中使用Javascript文件中的内联C#

在MVC框架中使用Javascript文件中的内联C#,javascript,asp.net-mvc,Javascript,Asp.net Mvc,我正试图让内联C#使用MVC框架在我的JavaScript文件中工作。我编了这个小测试代码 $(document).ready(function() { alert(<%= ViewData["Message"] %>); }); $(文档).ready(函数(){ 警惕(); }); 当在视图内部使用此代码时,它可以完美地工作。当我跳出我的aspx视图并在JavaScript文件中尝试此操作时,我会得到非法的XML字符。我想这是在MVC框架中设计的,但我还没有在网上找到

我正试图让内联C#使用MVC框架在我的JavaScript文件中工作。我编了这个小测试代码

$(document).ready(function() {
    alert(<%= ViewData["Message"] %>);
});
$(文档).ready(函数(){
警惕();
});
当在视图内部使用此代码时,它可以完美地工作。当我跳出我的aspx视图并在JavaScript文件中尝试此操作时,我会得到非法的XML字符。我想这是在MVC框架中设计的,但我还没有在网上找到任何关于这方面的资料

有没有人让内联C#使用MVC框架在JavaScript文件中工作

内联C#必须由服务器处理才能有意义。当然,它不会只处理普通的JavaScript文件。

当您在单独的文件中包含C#代码并将其包含在视图中时,服务器不会处理代码,浏览器将调用脚本文件,内联脚本将被视为普通字符串


或者,您可以在包含脚本文件时尝试使用script runat=server,但我不确定这会产生什么影响。aspx文件是MVC框架的视图文件。框架仅渲染视图和局部视图。我认为不存在在javascript文件中使用服务器端代码的方法

您可以将邮件包含在隐藏字段中

<%-- This goes into a view in an .aspx --%>
<%= Html.Hidden("MyMessage", ViewData["Message"]) %>
正如其他人所说,服务器没有处理C#

一个可能的解决方案是使用一个单独的视图,该视图使用相同的模型并输出JavaScript,然后在
中引用该视图

根据以下内容添加:


将内容类型设置为
text/javascript
,并将您的javascript源代码直接放在
下面。您的web服务器不处理.js文件,它只向客户端提供这些文件。这与.aspx或其他ASP.NET文件类型不同。这些文件在提供给客户端之前由服务器进行解释。

您可以创建一个呈现JavaScript的ASPX视图


将内容类型设置为
text/javascript
,并将您的javascript源代码直接放在
下面,我同意Serhat。最好是呈现一个HTML隐藏字段,或者,如我所提到的,转到一个URL。这可以通过Web服务甚至IHttpHandler实现来实现。然后,您可以使用诸如“messages.axd?id=17”之类的url来添加到Grant中,并且实际上可以欺骗Visual Studio在其解决方案中为您提供IntelliSense,如下所示:

<%if (false) {%><script type="text/javascript"><%} %>
// your javascript here
<%if (false) {%></script><%} %>

//你的javascript在这里

在他的解决方案中,当它呈现到页面时,要求没有
标记,但这有一个副作用,即关闭VisualStudio中的JavaScript IntelliSense。有了上述功能,Visual Studio将为您提供IntelliSense,同时在执行时不会呈现
标记。

这是一个老问题,但对于那些将来通过google偶然发现的人来说,最好的解决方案是使用data-*属性传递变量。可以使用隐藏元素,但您也可以使用
标记本身,并为其指定唯一的ID


这里给出了一个完整的例子:

我也这么想,但我希望可能会有什么结果。我正在尝试获取我的html助手类,该类为我在javascript文件中工作提供了良好的绝对链接。我认为这是我见过的最好的解决方案。另一种选择是有一个我可以访问的url,它会吐出我正在寻找的消息或链接信息。然后我可以随意使用它。@Serhat:Or var msg='';在视图和$(document).ready(函数(){alert(msg);});在JS文件中。在您的解决方案和我的建议中,有一点很重要,如果“Message”可能包含引号或换行符,必须特别注意避开这些问题,否则可能会破坏解决方案中的隐藏输入或我建议中的JavaScript变量赋值。我认为可能会解决缺少intellisense的问题,这是一个好主意,但实际上为什么有人想这样做,除非可以缓存包含javascript的aspx视图的结果。因为如果没有,那么这就等同于将脚本代码直接嵌入到使用它的主页面中。我错了吗?@Roberto:如果它被多个页面使用呢?如果是的话。对于重复使用,这是一个很好的解决方法。但我考虑的更多是复制传统上包含的外部JavaScript文件的缓存功能。当我将JavaScript放入外部.js文件而不是嵌入它时,我这样做的目的是缩小页面大小以优化加载时间,还允许浏览器缓存该.js文件以供其他使用它的页面使用,因此它不必每次都重新下载它。考虑到将JavaScript放入aspx文件,它确实提供了可重用性&插入内联c#的能力,但失去了像传统外部链接的.js文件那样缓存它的能力:(我想知道是否有办法解决这个问题。
<%if (false) {%><script type="text/javascript"><%} %>
// your javascript here
<%if (false) {%></script><%} %>