如何在.js文件中嵌入Razor C#代码?

Ken*_*vet 13 javascript c# razor asp.net-mvc-3

必须嵌入javascript代码块

<script type='text/javascript'>
  ...
</script>
Run Code Online (Sandbox Code Playgroud)

但Razor代码不会编译在.js文件中,包含在.cshtml文件中.

如何使这项工作?或者还有其他优雅的方式来产生类似的效果吗?

谢谢.

jcr*_*898 20

当我遇到这个问题时,有时候我会在.csh文件中提供一个可以在.cshtml文件中访问的函数...

// someFile.js
var myFunction = function(options){
    // do stuff with options
};

// razorFile.cshtml
<script>
    window.myFunction = new myFunction(@model.Stuff);
    // If you need a whole model serialized then use...
    window.myFunction = new myFunction(@Html.Raw(Json.Encode(model)));
</script>
Run Code Online (Sandbox Code Playgroud)

不一定是最好的选择,但如果你必须这样做它就会做...

您可能尝试的另一件事是在您的html元素上使用数据属性,例如jQuery.validate.unobtrusive如何...

//someFile.js
var options = $("#stuff").data('stuff');

// razorFile.cshtml
<input type="hidden" id="stuff" data-stuff="@model.Stuff" />
Run Code Online (Sandbox Code Playgroud)


scr*_*dam 5

下面是一个提供 Javascript 服务的 Razor 网页示例(不是 MVC 视图,尽管这很相似)。当然,动态编写 Javascript 文件并不常见,但这里仍然有一个示例。我曾经使用过这个,当时我希望提供 JSON 数据和其他一些计算成本昂贵且很少更改的内容 - 因此浏览器可以包含它并像常规 JS 文件一样缓存它。这里的技巧只是设置Response.ContentType,然后<text>为你的 Javascript 使用类似 Razor 标签的东西。

@{
Response.ContentType = "text/javascript";
Response.Cache.SetLastModified(System.Diagnostics.Process.GetCurrentProcess().StartTime);
Response.Cache.SetExpires(System.DateTime.Now.Date.AddHours(28));
Response.Cache.SetCacheability(System.Web.HttpCacheability.Public);
<text>
var someJavaScriptData = @someSortOfObjectConvertedToJSON;
function something(whatever){
}
</text>
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其包含在其他 Razor 文件中:

<script src="MyRazorJavascriptFile.cshtml"></script>
Run Code Online (Sandbox Code Playgroud)