什么是 MVC 6 中 @Scripts.Render 的替代品

Posted

技术标签:

【中文标题】什么是 MVC 6 中 @Scripts.Render 的替代品【英文标题】:Whats the replacement for @Scripts.Render in MVC 6 【发布时间】:2015-12-13 20:29:12 【问题描述】:

我正在尝试在我的 MVC 6 上运行一些 d3js,并且正在查看这个示例 https://github.com/DustinEwers/D3-DotNetMVC-Demos/blob/master/D3Demos/Views/TagDemos/BasicBarChart.cshtml,它使用了

@Scripts.Render("~/bundles/d3")
@section Scripts

但如果我这样做,我会得到

当前上下文中不存在名称“脚本”

那么在 MVC 6 中是否有一种新的方法呢?

【问题讨论】:

【参考方案1】:

在 ASP.NET 5 中,没有这样的 Scripts.Render 方法。要渲染脚本,您可以使用环境标签助手。

您不必使用环境标签助手。您可以直接将您的脚本标签放在布局文件中。但是环境助手允许我们根据环境有条件地渲染脚本。 (缩小捆绑版本与所有未缩小版本

这是语法,您可以将其包含在布局文件中。

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/js/d3.js"></script>
</environment>
<environment names="Staging,Production">
    <script src="//ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
            asp-fallback-test="window.jQuery">
    </script>            
    <script src="~/js/d3.min.js" asp-file-version="true"></script>
</environment>

假设您有脚本文件d3.js and d3.min.js 存在于~/js 目录中。

您还需要确保在Configure() 方法中调用了UseStaticFiles() 方法(在Startup.cs 中)

public void Configure(IApplicationBuilder app, IHostingEnvironment env,  
                                                             ILoggerFactory loggerFactory)

     //Other configuration goes here
     app.UseStaticFiles();  // This enables static file serving from the app.
     app.UseMvc(routes =>
        
            routes.MapRoute(
                name: "default",
                template: "controller=Home/action=Index/id?");
        );

UseStaticFiles() 扩展方法启用静态文件服务,包括 js 文件、css 文件等。

当您在开发模式下运行应用程序时,它将在环境"Development" 内渲染脚本标签,当您在暂存或生产环境下运行它时,它将在"Staging,Production" 环境下渲染脚本标签。

您可以通过右键单击项目并选择properties-&gt;Debug并指定环境变量的值Hosting:Environment来更改环境值

你可以看到我已经在 Staging/Production 环境中包含了 js 文件的缩小版本。这不是必需的,而是首选的方法,因为它会节省一些带宽。 (如果你真的想这样做,你可以把未缩小的版本也放在那里而不是缩小。)。如果您有单个捆绑文件,您也可以在此处使用它而不是单个文件。

如果您还没有缩小版本,您可以通过运行 gulp 任务来生成该缩小版本。(这包含在默认的 gulp.js 文件中,该文件位于新的 Web 应用程序模板中)。您只需要打开任务运行器并运行缩小任务即可。

如果您不希望每次都手动运行它,您可以选择Bindings -&gt; Before build,这样它就会在您每次构建项目时自动运行该 purticular gulp 任务。

【讨论】:

btw 很棒的答案 :) 微软似乎已经远离 Gulp,至少在默认情况下是这样。模板项目现在依赖于BundlerMinifier.Core 工具,如docs.microsoft.com/en-us/aspnet/core/migration/mvc 中所述【参考方案2】:

现在有点复杂,但documentation 解释得很好:

ASP.NET MVC 5 入门 Web 模板利用了 ASP.NET 对捆绑的内置支持。在 ASP.NET MVC 6 中,使用客户端构建步骤可以更好地执行此功能...

所以要将脚本捆绑在一起,您可以使用gulp-concat 之类的工具。要包含脚本,只需按照静态内容的方式添加即可:

<script src="~/lib/bundle.js"></script>

对于包含内容的更完整示例,@Shyju 的回答非常好。

【讨论】:

它绝对没有回答如何自动将缩小的文件包含在视图中!正如我现在所看到的,我们必须分别指定每个文件。【参考方案3】:

如果您不想运行该脚本,只需创建一个 html 脚本标签:

<script src="js/d3.js?version=1"></script>

但我真的建议您捆绑并缩小您的资产文件。 在Gulp 和 Grunt 等任务运行器的帮助下,您可以捆绑、缩小、移动(以及更多)您的 javascript/css 文件。

关于如何使用 gulp 的信息可以在这里找到:http://rudiv.se/Article/asp-net-5-bundling-with-bower-and-gulp

然后在 Shyju 的帮助下,在您运行开发或暂存环境时加载正确的文件。

【讨论】:

不要使用 URL 缩短器,它们只是链条中的另一个可能断裂的环节。

以上是关于什么是 MVC 6 中 @Scripts.Render 的替代品的主要内容,如果未能解决你的问题,请参考以下文章

MVC 6 - TagHelper 选择

MVC 6 中的 @Json.Encode 或 @Json.Decode 方法在哪里?

MVC 6 视图组件与部分视图:有啥区别?啥时候应该使用每个? [关闭]

MVC 脚手架不支持 Entity Framework 6 或更高版本

spring mvc 版本,怎么查

Spring MVC详解(学习总结)