MVC 4中@Scripts“不存在”

202

我刚刚创建了一个ASP.NET MVC 4项目,使用Visual Studio 2012 RC创建了一个控制器和用于IndexCreate操作的Razor视图。

当我运行应用程序并浏览到Create视图时,出现了以下错误:

  

编译器错误消息:CS0103:当前上下文中不存在“Scripts”名称

问题在于自动添加到View底部的以下代码:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
为什么Scripts不存在?
我查看了程序集System.Web.Mvc.dll,版本为v4.0.0.0中的基本Web页面类。
我可以看到以下可用的辅助属性:
- Ajax - Html - Url
但是没有名为Scripts的内容。
有任何想法吗?
编辑:我的Web.config文件如下(未经过Visual Studio创建):
  <system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <pages pageBaseType="System.Web.Mvc.WebViewPage">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

编辑 #2:

有人在博客中介绍了使用@Scripts辅助工具的方法:

然而,尽管 Visual Studio 将它添加到生成的视图中,但刚刚在全新的 Windows 8 安装中安装了 Visual Studio 2012 RC 后我仍然无法使用 @Scripts

以下是解决方案。

我不确定如何关闭这个问题,因为最后一个更新似乎解决了这个问题。我仔细检查了自己是否执行了干净的安装,使用了一个新项目。但是在各种更新和没有手动显而易见的干预之后,之前无法正常工作的项目现在可以正常工作了。感谢所有的想法,但当时肯定存在问题;)


已经尝试将其添加到Web.config文件中了吗?<system.web.webPages.razor> <pages pageBaseType=""> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> 等等... </pages> - Zach dev
我已经添加了来自Web.config的部分,但是我没有更改该文件中的任何内容。 - FantasticJamieBurns
6
你的意思是"My Views\Web.config" 文件而不是应用程序根目录下的 web.config 文件。无论如何,它缺少 <add namespace="System.Web.Optimization"/>,并且是错误的。你之前安装了 VS12 Beta 吗?你的 Windows 8 版本是什么? - RickAndMSFT
@RickAndMSFT 我从发布预览版ISO进行了干净的Win8安装,同时也安装了来自VS 2012 RC ISO的安装程序,以确保这不是版本冲突的问题。 - FantasticJamieBurns
@RickAndMSFT 我的 Views\Web.config 文件中可能会缺少某些区域中的视图。 - Maslow
24个回答

270
这里的关键是添加

 <add namespace="System.Web.Optimization" /> 

需要将以下内容添加到两个web.config文件中。我的情况是,我在项目和主/根web.config中都有System.Web.Optimization引用,但@Scripts仍然无法正常工作。您需要将命名空间引用添加到Views web.config文件中才能使其正常工作。

更新:

自MVC 4发布以来,System.Web.Optimization现已过时。如果您从一个空解决方案开始,您需要安装以下nuget包:

Install-Package Microsoft.AspNet.Web.Optimization

您仍需要在web.config文件中引用System.Web.Optimization。有关更多信息,请参阅此主题:

如何为转换为4应用的MVC 3添加对System.Web.Optimization的引用

正如许多人指出的那样,在上述步骤之后,可能需要重新启动VS才能使其工作。


8
在空白的ASP.NET MVC4模板中,您可能还需要运行Install-Package Microsoft.AspNet.Web.Optimization,因为它不是默认包含的。 - Portman
@Portman 是的,确实如果您从空白的MVC项目模板开始,您需要安装Microsoft.AspNet.Web.Optimization包。 - Marko
2
只需要在 Views 文件夹的 web.config 中添加即可。 - user1534664
从NuGet安装包只更新了我的ROOT web.config,我不得不手动更新/Views/web.config。 - ProVega
9
确实,这就是解决方案。但是,我需要重新启动visual studio才能被识别。 - Jason Eades
4
我需要将此添加到我的 Views/Web.config 文件中,然后重新启动 Visual Studio。 - Caverman

49

@Styles@Scripts 是由 System.Web.Optimization 库提供的两个新的辅助工具。顾名思义,它们分别捆绑和压缩 CSS 和 JavaScript 文件或资源。

尝试通过 @using 指令或通过 web.config 包含命名空间 System.Web.Optimization

http://ofps.oreilly.com/titles/9781449320317/ch_ClientOptimization.html#BundlingAndMinification

更新

Microsoft 将捆绑/压缩移到一个名为 Microsoft.AspNet.Web.Optimization 的单独包中。您可以从nuget下载程序集。

这篇文章对您有用。


2
添加 System.Web.Optimization 时出现“CS0234:命名空间 'System.Web' 中不存在类型或命名空间名称为 'Optimization'”。也没有叫做 System.Web.Optimization 的引用可供添加。 - FantasticJamieBurns
1
System.Web.Optimization 命名空间已经被弃用,建议使用 Microsoft.AspNet.Web.Optimization 替代。 更多信息请参见此问题:https://dev59.com/WWox5IYBdhLWcg3wCQAq - Jeremy Jarrell
3
澄清:System.Web.Optimization 命名空间并未被弃用,只有 System.Web.Optimization.dll 被弃用。 - Despertar
谢谢!当我遇到不同区域的布局问题时,这对我很有帮助。 - NoWar

47
把以上内容补充完整还需要一个小步骤,我在另一篇文章里找到了答案。在添加

后即可。
<add namespace="System.Web.Optimization" />

在你的~/Views/web.config文件中添加命名空间,关闭并重新打开Visual Studio。 这就是我为了让这个工作起来所做的事情。


2
我也遇到了同样的问题,重启VS后问题得以解决,但在此之前仍显示错误。 - Andreas
在我的情况下,关闭VS并不是必要的,但我不得不关闭并重新打开我正在使用的.cshtml视图。 - joalcego

31

我正在使用区域,并且刚刚遇到了这个问题,我只是将根web.config中的命名空间复制到区域web.config中,现在它可以工作了!!

    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />        
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />

15

我曾经也遇到这个问题,后来使用了WinMerge帮助我跟踪解决它。但当我进一步研究它时,发现Rick有一篇完美的博客文章

总结:

  • 在两个web.config文件中都添加 <add namespace="System.Web.Optimization"/>
  • 运行 Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization
  • 更新捆绑代码
  • 更新布局文件
  • 最后一步是更新其他10个库。 我没有这样做,但它仍然可以正常工作。看起来您可以拖延这一步(除非我已经更新了其中1个或更多)。 :)

感谢您回答这个问题,丹!(并指出我的博客)。他的问题暗示他从RC开始,但我认为你是对的。他只是在Beta项目中添加了一个带有RC的控制器。 - RickAndMSFT
已经过去了几周,你们俩肯定让我开始怀疑自己。我确实将VS 2012安装到了我的平板电脑上,而它之前从未安装过除了Metro应用以外的任何东西,结果失败了。我会在虚拟机中再试一次。 - FantasticJamieBurns
这对我起作用了。阅读链接的文章以获取关于你需要做什么的确切说明。 - Justin

11
我遇到了同样的问题:
我使用的System.Web.Optimization版本已经过时,不适用于MVC4 RC。
我使用VS 2010中的包管理器更新了我的软件包。
在这篇MSDN博客中,Andy先生讲述了如何将您的MVC 4 Beta项目更新为MVC 4 RC。 更新我的软件包使得脚本(特别是Web优化)可以解决我的问题:
要安装最新的System.Web.Optimization软件包,请使用Package Manager Console(工具->库包管理器->Package Manager Console)并运行以下命令:
Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization

请将包中的System.Web.Optimization文件添加到您的引用中。
要更新其他包: 工具菜单->库程序包管理器->管理解决方案的NuGet程序包。

5

在你的razor视图中,将System.Web.Optimization导入到顶部,如下所示:

@using System.Web.Optimization

5
创建一个新的MVC 4 RC互联网应用程序并运行它。导航至使用相同代码的登录页面。
 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

Login.cshtml能够正常工作的原因是Views\Web.config文件(而不是应用程序根目录下的版本)包含了以下内容:

<namespaces>

    <add namespace="System.Web.Optimization"/>

  </namespaces>

为什么你的创建视图不起作用,而登录却可以?

我没有使用登录 - 那时可能已经出了问题。 - FantasticJamieBurns

3
我遇到了这个问题,然而在运行命令时:
Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization 

我收到了这条难懂的消息(在喝第一杯咖啡之前,我真的很喜欢这个伟大的双关语):

Install-Package:此平台不支持指定的加密算法。

我正在Windows XP SP3上运行它(没有选择),我发现我必须按照用户artsnobASP.NET Forum上发布的说明操作:

  • 请卸载Nuget并尝试重新安装。如果无法执行此操作,请以管理员身份登录。
  • 转到工具=>扩展管理器=>选择“Nuget Package Manager”=>卸载
  • 通过搜索“Nuget”=>安装再次安装它。
  • 如果它没有起作用,请尝试安装1.7.x版本,如我在先前的帖子中提到的(这并不意味着您必须使用旧版本,如果它可以正常工作,我们可以报告此错误并获取最新版本的修补程序)。

运行此命令后,我就可以运行命令行来更新Web.Optimization。

希望这能节省某人的时间。


2

只需编写

@section Scripts{
    <script src="@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("~/bundles/jqueryval")"></script>
}

@archil 谢谢你提供的替代方案 - 那将是一个很好的临时解决方案。但主要问题是“为什么Scripts不存在?” - FantasticJamieBurns
@Jamie 应该存在吗?我的意思是,据我所记得,没有 Scipts 帮助程序。也许你正在尝试使用一些第三方帮助程序? - archil
1
我自己没有添加那段代码 - Visual Studio 2012 RC 在为我的 Create Action 创建 View 时添加了它。我认为我的 MVC 4 不是正确的版本。它必须在某个地方工作,因为 Scott Hanselman 提到失败的语法是 MVC 4 RC 的一个新添加功能:http://www.hanselman.com/blog/VisualStudio2012RCIsReleasedTheBigWebRollup.aspx - FantasticJamieBurns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接