在cshtml razor视图中分离JavaScript

时间:2012-03-13 10:32:36

标签: c# javascript asp.net asp.net-mvc-3

我是ASP.NET / MVC3的新手,我正试图弄清楚如何将我的JavaScript(包含C#)与HTML的其余部分分开。

如果我将它们放入.JS文件并使用脚本标记插入它们,那么它们的C#方面就会停止工作。在MVC 3 razor中分离包含C#代码的JavaScript代码的最佳方法是什么?

感谢。

5 个答案:

答案 0 :(得分:10)

出于多种原因,最好将大部分(如果不是全部)JS放入单独的JS文件中(以便您可以利用重用,缩小,浏览器优化,内容交付网络等。)

要将服务器端razor代码的结果读入JS文件,请使用以下方法之一:

1)将您的剃刀代码放入视图中的javascript变量(未经过测试的代码)

<script type="text/javascript">
  if(!MyGlobalVariables){
     MyGlobalVariables = {};
  }
  MyGlobalVariables.IndexUrl = "@Url.Action("Index")";
</script>

2)使用自定义属性(最好以数据为前缀 - 如HTML 5 spec中所述)。请参阅此处的相关讨论:Can I add custom attribute to HTML tag?

<div data-index-url="@Url.Action("Index")"></div>

然后,在jQuery中使用$(this).attr(“data-index-url”)来访问渲染的剃刀标记。

3)将C#放入视图中的隐藏输入字段,并读取JS文件中的隐藏输入。

<input id="indexUrl" type="hidden" value="@Url.Action("Index")" />

要在jQuery中阅读此内容,您可以使用$(“#indexUrl”)。val()

答案 1 :(得分:1)

Javascript代码应该包含任何动态生成的代码。如果需要加载某些配置设置,则应使用单个内联脚本标记来定义变量。其他选项是加载到json配置文件中,该文件是动态生成的,或者根据您需要的特定动态信息将其基于dom内容。 (Ajax是我说的最常见的方式,但这实际上取决于你的情况)。无论哪种方式,我们的想法是javascript和css文件总是静态。

答案 2 :(得分:1)

相反,在您的视图页面中执行以下操作:

var options = {
    parameter1 : '@(SomeC#Value)',
    parameter2 : '@(SomeC#Value)',
    parameter3 : '@(SomeC#Value)',
}
然后打电话给:

myJavascriptObject.init(options);

并让Javascript使用传入的选项来控制流程等。

答案 3 :(得分:0)

如果在引用外部js文件时有什么东西停止工作,也许你做错了什么。向我们提供一些关于如何引用外部文件的示例代码。另一种方法是将JavaScript代码放在文件中某处的脚本标记之间。如果它在_Layout.cshtml中,您可以将它放在head-tag和另一个cshtml文件中,将它放在脚本标记之间。

答案 4 :(得分:0)

我们将C#对象转换为Json,扩展名为object和JavaScriptSerializer:

public static string ToJson(this object item)
    {
        return new JavaScriptSerializer().Serialize(item);
    }

然后我们将它设置在一个变量上(或者在我们的例子中将它传递给JavaScript控制器的构造函数)