MVC 4 @Scripts“不存在”


201

我刚刚创建了一个ASP.NET MVC 4项目,并使用Visual Studio 2012 RC创建了Controller和Razor Views for Indexand CreateActions。

当我开始运行应用程序并浏览到Create视图时,显示以下错误:

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

问题是以下代码自动添加到视图的底部:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

为什么脚本不存在?

我查看了Assembly System.Web.Mvc.dll v4.0.0.0中的基本Web页面类

我可以看到以下可用的助手属性:

  • 阿贾克斯
  • HTML
  • 网址

但是没有什么叫脚本。

有任何想法吗?

编辑:

我的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助手:

@Scripts即使将Visual Studio 2012 RC安装到全新的Windows 8安装上,即使Visual Studio将其添加到生成的View中,我仍然无法使用!

解决方案如下。

我不确定如何结束此操作,因为最后通过更新似乎可以解决该问题。我再次检查了是否使用新项目执行了全新安装。但是,在进行了各种更新并且没有人工的明显干预之后,我所做的同样失败的项目现在可以正常工作。感谢您的所有想法,但当时肯定有问题;)


已经尝试在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" /> etc... </pages>
Zach dev

我已经从Web.config中添加了该部分,但没有更改该文件中的任何内容。
FantasticJamieBurns 2012年

6
您的意思是“我的Views \ Web.config”文件而不是应用程序根目录web.config。无论如何,它是不正确的,并且缺少<add namespace =“ System.Web.Optimization” />。您是否在RC之前安装了VS12 Beta?什么win8版本?
RickAndMSFT 2012年

@RickAndMSFT我从Release Preview ISO进行了全新的Win8安装,并从VS 2012 RC ISO进行了完整安装,以确保绝对不会与版本冲突。
FantasticJamieBurns

@RickAndMSFT我的Views \ Web.config将丢失区域中的任何视图
Maslow

Answers:


268

关键是要添加

 <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。有关更多信息,请参见以下主题:

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

许多人指出,在完成上述步骤后,可能需要重新启动VS。


8
您可能还必须Install-Package Microsoft.AspNet.Web.Optimization从空白的ASP.NET MVC4模板运行,因为默认情况下不包含该模板。
波特曼

@Portman是的,如果从空白的MVC项目模板开始,则确实需要安装Microsoft.AspNet.Web.Optimization包。
Marko

2
对我来说,只需要在Views文件夹的web.config中添加它。
user1534664

9
这确实是解决方案。但是,我需要重新启动Visual Studio才能识别该问题。
杰森·埃德斯

4
我必须将此添加到我的Views / Web.config,然后重新启动Visual Studio。
Caverman's

48

@Styles并且@ScriptsSystem.Web.Optimization图书馆提供的2个新帮助器。顾名思义,它们分别捆绑和缩小CSS和JavaScript文件或资源。

尝试System.Web.Optimization通过@using指令或通过方式包括名称空间web.config

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。看到这个问题的更多信息:stackoverflow.com/questions/9475893/...
杰里米·贾雷尔

3
澄清:System.Web.Optimization名称空间未弃用,System.Web.Optimization.dll是。
Despertar

谢谢!当我遇到其他区域的布局问题时,它为我工作。
开发人员

48

以上内容缺少一小步,我在另一篇文章中发现了。添加后

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

到您的~/Views/web.config名称空间,关闭并重新打开Visual Studio。 这是我必须做的才能使它正常工作。


2
同样在这里,VS重启可以正常工作,但是在此之前它仍然显示错误...?
Andreas

在我的情况下,无需关闭VS,但我必须关闭并重新打开我使用的.cshtml视图
joalcego

29

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

    <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拥有完美的博客文章

摘要:

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

感谢您回答这个丹!(并指出我的博客)。他的问题暗示他是从RC开始的,但我认为您是对的。他只是将带有RC的控制器添加到Beta项目。
RickAndMSFT 2012年

已经过了几周,你们俩当然都让我第二次猜测自己。我当然将VS 2012放到我的平板电脑上,而平板电脑除了Metro Apps之外什么都没有,却发现它失败了。我将在VM中重试。
FantasticJamieBurns

这对我有用。阅读链接的文章,以获取有关您需要做什么的确切说明。
贾斯汀

11

我遇到过同样的问题:

我使用的System.Web.Optimization版本对于MVC4 RC已过时。

我在VS 2010中使用程序包管理器更新了程序包。

在此MSDN博客中,Andy先生讨论了如何将MVC 4 Beta项目更新为MVC 4 RC。更新我的程序包后,脚本(尤其是Web优化程序)可以为我解决:

要安装最新的System.Web.Optimization软件包,请使用软件包管理器控制台(工具->库软件包管理器->软件包管理器控制台)并运行以下命令:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization

使用参考中包中包含的System.Web.Optimization文件。

要更新其他软件包:工具菜单->库软件包管理器->管理解决方案的NuGet软件包。


5

创建一个新的MVC 4 RC Internet应用程序并运行它。导航到使用相同代码的登录名

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

允许Login.cshtml起作用的是Views \ Web.config文件(不是应用程序的根版本),其中包含

<namespaces>

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

  </namespaces>

为什么您的“创建”视图不起作用,而“登录”却不起作用?


我没有使用登录-当时可能已经坏了。
FantasticJamieBurns'Burn

5

如下所示,在您的剃刀视图上导入System.Web.Optimization:

@using System.Web.Optimization

3

我在运行命令时遇到了这个问题:

Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization 

我收到了一个神秘的信息(在喝第一杯咖啡之前,您一定要喜欢一个双关语):

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

我在Windows XP SP3上运行此程序(不是出于选择),发现我必须遵循用户artsnobASP.NET论坛上发布的说明。

  • 请卸载Nuget,然后尝试重新安装。如果无法执行此操作,请以管理员身份登录。
  • 转到工具=>扩展管理器=>选择“ Nuget软件包管理器” =>卸载
  • 通过搜索“ Nuget” =>安装再次安装。
  • 如果它不起作用,请尝试安装我在上一篇文章中提到的1.7.x版本(这并不意味着您必须使用以前的版本,如果工作正常,我们可以报告此错误并获取最新版本的补丁)。

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

希望这可以节省一些挖掘工作。


2

写就好了

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

@archil感谢您的替换-这将是一个很好的临时解决方案。但是主要的问题是“为什么不存在脚本?”
FantasticJamieBurns

@Jamie应该存在吗?我的意思是,据我所记得,那里没有Scipts帮助器。也许您正在尝试使用一些第三方帮助程序?
archil 2012年

1
我自己没有添加该代码-Visual Studio 2012 RC在为“创建操作”创建视图时添加了该代码。我认为我的MVC 4不合适。它必须努力的地方,因为斯科特Hanselman在使出现故障的语法提到作为一个新的除了MVC 4 RC:hanselman.com/blog/...
FantasticJamieBurns

1

我从Beta版升级到了RC版,遇到了“脚本”不存在的问题。网上冲浪,最终的解决方案是N40JPJ所说的,再加上另一种工作原理:

将以下内容复制到View \ Web.config中:

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

以及View \ Shared_Layout.cshtml中的以下内容

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

希望能帮助到你。


1
if (IsSectionDefined())除非您提供else条款,否则无需使用。您所说的事实required: false已经允许不定义该部分,在这种情况下,该部分将被省略。因此,这是不必要的额外代码。
ErikE

0

显然,您创建了一个没有“脚本”文件夹的“空”项目类型。我的建议-创建一个具有完整“脚本”文件夹的“基本”项目类型。

对于所有开发人员。


0

只需从控制器的“创建和编辑”剃刀视图中删除/隐藏代码即可。

 @section Scripts {  

   @Scripts.Render("~/bundles/jqueryval")  
 }  

0
  1. :删除查看页面。
  2. :添加名称空间webconfig(在视图目录中)
  3. :创建视图试试!

祝好运...


0

即使在web.config中为root和View的根定义了锅,也需要花更多的时间来解决这个问题。原来我错误地将其添加到<system.web><pages><namespaces>,而不是<system.web**.webPages.razor**><pages><namespaces>元素中。

真的很容易错过!


0

当我进入具有以下代码的页面时:

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

发生此错误:错误。处理您的请求时发生错误。

这个异常记录在我的日志中:

System.Web.HttpException (0x80004005): The controller for path '/bundles/jqueryval' was not found or does not implement IController.
   em System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
...

我尝试了此页面上的所有提示,但没有一个为我解决。因此,我查看了我的Packages文件夹,发现System.Web.Optmization.dll有两个版本:

  • Microsoft.AspNet.Web.Optimization.1.1.0 (v1.1.30515.0-68,7KB)
  • Microsoft.Web.Optimization.1.0.0-beta (v1.0.0.0-304KB)

我的项目引用的是旧版Beta。我只将引用更改为较新的版本(69KB),并且eveything效果很好。

我认为这可能会对某人有所帮助。


0

那有一个明显的解决方案。后来我遇到了同样的问题。与程序集引用或...不相关。当您具有复杂的页面结构时,将在MVC局部视图的层次结构调用中发生。因此,分别调用/渲染每个页面上的每个部分(可能是母版页或部分页面)将导致看不到页面的必需部分,例如以下代码:

@RenderSection("Scripts", required: false)

这只是强制页面查找并呈现相关部分,如果出现故障,则会向您显示一条类似您的错误消息。

因此,我建议您将页面(例如程序跟踪)从master跟踪到其所有部分以检测Dependencies。也许这是一项可怕的工作,但是这里没有其他选择。

并非根据我的经验,编程中的某些条件情况导致无法向您显示正确的错误会导致问题。


0

在将区域添加到没有任何项目的项目后,出现了这个问题。为了摆脱它,只需将带有根Views文件夹的web.config复制到该区域的Views文件夹中,它便开始工作。


0

我通过在_Layout.cshtml中添加这部分代码来解决MvcMusicStore中的此问题

@if (IsSectionDefined("scripts")) 
{
       @RenderSection("scripts", required: false)
}

并从Edit.cshtml中删除此代码

 @section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

运行inshallah程序将与您合作。


0

对我来说,这解决了问题,在NuGet程序包管理器控制台中编写以下内容:

update-package microsoft.aspnet.mvc -reinstall

0

当我最近开始使用MVC4时,在使用空模板创建项目时遇到了上述问题。解决此问题的步骤。

  1. 转到TOOLS-> Library Package Manager-> Packager Manager Console 粘贴以下命令,然后按Enter键 Install-Package Microsoft.AspNet.Web.Optimization 注意:等待成功安装。
  2. 在根级别转到Web.Config文件,然后在页面命名空间部分的命名空间下方添加。加<namespace="System.Web.Optimization" />
  3. 转到Views文件夹中的Web.Config并执行步骤2。
  4. 构建解决方案并运行。

第1步中提到的Package会将少量系统库添加到解决方案引用中,例如System.Web.Optimization不是MVC4中空模板的默认引用。

我希望这有帮助。谢谢


0

从MVC3升级到MVC4时,我遇到了非常类似的错误。

编译器错误消息:CS0103:名称[blah]在当前上下文中不存在

就我而言,我的多个Web.Config中的版本号已经过时。

  1. 我需要在项目中的每个Web.Config中将System.Web.Mvc版本号从“ 3.0.0.0”更新为“ 4.0.0.0”。
  2. 我需要将项目中每个Web.Config中的所有System.Web.WebPages,System.Web.Helpers和System.Web.Razor版本号从“ 1.0.0.0”更新为“ 2.0.0.0”。

例如:

<configSections>
  <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
    <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
  </sectionGroup>
</configSections>

...

<compilation debug="true" targetFramework="4.0">
  <assemblies>
    <add assembly="System.Web.Helpers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
    <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
  </assemblies>
</compilation>

确保查看每个View目录中的Web.Configs。

您可以阅读有关将ASP.NET MVC 3项目升级到ASP.NET MVC 4的更多信息


0

如果添加到web.config并仍然显示消息,则需要关闭您的项目并重新打开它,现在它已经存在,并且@ Styles.Render(“”)和@ Scripts.Render()可以正常工作。


-1

试试这个:

@section Scripts 
{
    Scripts.Render("~/bundles/jqueryval")  // <- without ampersand at the begin
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.