【问题标题】:MVC 4 @Scripts "does not exist"MVC 4 @Scripts“不存在”
【发布时间】:2012-06-12 16:18:40
【问题描述】:

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

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

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

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

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

为什么脚本不存在?

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

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

  • 阿贾克斯
  • 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 助手:

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

解决方案如下。

我不知道如何关闭它,因为最终更新似乎解决了这个问题。我仔细检查了我是否使用新项目执行了全新安装。但是在经过各种更新并且没有明显的手动干预之后,我所做的同样失败的项目现在可以正常工作了。感谢所有的想法,但当时肯定有问题;)

【问题讨论】:

  • 已经尝试在 Web.config 中添加? &lt;system.web.webPages.razor&gt; &lt;pages pageBaseType=""&gt; &lt;add namespace="System.Web.Mvc" /&gt; &lt;add namespace="System.Web.Mvc.Ajax" /&gt; &lt;add namespace="System.Web.Mvc.Html" /&gt; etc... &lt;/pages&gt;
  • 我已从 Web.config 添加了该部分,但我没有更改该文件中的任何内容。
  • 您的意思是“My Views\Web.config”文件,而不是应用根 web.config。无论如何,它是不正确的并且缺少 。您是否在 RC 之前安装了 VS12 Beta?什么win8版本?
  • @RickAndMSFT 我从 Release Preview ISO 进行了干净的 Win8 安装,并从 VS 2012 RC ISO 进行了安装,以确保它没有版本冲突。
  • @RickAndMSFT My Views\Web.config 将错过区域中的任何视图

标签: asp.net-mvc razor


【解决方案1】:

这里的关键是添加

 <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。有关详细信息,请参阅此主题:

How to add reference to System.Web.Optimization for MVC-3-converted-to-4 app

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

【讨论】:

  • 您可能还需要从空白的 ASP.NET MVC4 模板运行 Install-Package Microsoft.AspNet.Web.Optimization,因为它默认不包含在内。
  • @Portman 是的,如果您从空白 MVC 项目模板开始,您需要安装 Microsoft.AspNet.Web.Optimization 包。
  • 我只需要在Views文件夹的web.config中添加即可。
  • 这确实是解决方案。但是,我需要重新启动 Visual Studio 才能识别它。
  • 我必须将它添加到我的 Views/Web.config 中,然后重新启动 Visual Studio。
【解决方案2】:

@Styles@ScriptsSystem.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 下载程序集。

这个post会对你有用。

【讨论】:

  • 添加 System.Web.Optimization 说“CS0234:名称空间“System.Web”中不存在类型或名称空间名称“优化”。也没有要添加的名为 System.Web.Optimization 的引用。
  • System.Web.Optimization 命名空间已经过时,因为这个问题得到解答,请尝试改用 Microsoft.AspNet.Web.Optimization。有关更多信息,请参阅此问题:stackoverflow.com/questions/9475893/…
  • 澄清:System.Web.Optimization 命名空间未被弃用,System.Web.Optimization.dll 被弃用。
  • 谢谢!当我遇到不同区域的布局时,它对我有用。
【解决方案3】:

上面有一小步,我在另一篇文章中发现的。添加后

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

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

【讨论】:

  • 这里一样,重启VS工作但在此之前它仍然显示错误......?
  • 在我的情况下不需要关闭 VS,但我必须关闭并重新打开我正在使用的 .cshtml 视图
【解决方案4】:

我正在使用区域,并且刚刚遇到这个问题,我只是将命名空间从根 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" />

【讨论】:

    【解决方案5】:

    我遇到了同样的问题,我使用 WinMerge 帮助我找到了这个问题。但随着我对它进行更多研究,我发现 Rick 拥有完美的blog post

    总结:

    • &lt;add namespace="System.Web.Optimization"/&gt; 添加到两个 web.config 文件中
    • 运行Install-Package -IncludePrerelease Microsoft.AspNet.Web.Optimization
    • 更新捆绑代码
    • 更新布局文件
    • 最后一步是更新其他 10 个库。我没有,它工作得很好。所以看起来你可以拖延这个(除非我已经更新了其中的一个或多个)。 :)

    【讨论】:

    • 感谢您回答这个丹! (并指出我的博客)。他的问题暗示他从 RC 开始,但我认为你是对的。他刚刚在一个 Beta 项目中添加了一个带有 RC 的控制器。
    • 已经过去了几个星期,你们俩肯定让我猜不透。我当然将 VS 2012 放到了我的平板电脑上,除了 Metro Apps 之外什么都没有,但我发现它失败了。我将在 VM 中再试一次。
    • 这对我有用。阅读链接的文章,了解您需要做什么的确切说明。
    【解决方案6】:

    我遇到了同样的问题:

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

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

    在这个MSDN blog 中,Andy 先生谈到了如何将您的 MVC 4 Beta 项目更新为 MVC 4 RC。更新我的包得到了为我解决的脚本(尤其是网络优化):

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

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

    在您的参考资料中使用包中包含的 System.Web.Optimization 文件。

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

    【讨论】:

      【解决方案7】:

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

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

      允许 Login.cshtml 工作的是 Views\Web.config 文件(不是应用根版本)包含

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

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

      【讨论】:

      • 我没有使用登录 - 当时很可能已经被破坏了。
      【解决方案8】:

      在剃刀视图顶部导入 System.Web.Optimization,如下所示:

      @using System.Web.Optimization
      

      【讨论】:

        【解决方案9】:

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

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

        我收到了一条神秘的信息(在第一杯咖啡之前一定要爱上一句绝妙的双关语):

        Install-Package : 指定的加密算法不是 在这个平台上支持。

        我在 Windows XP SP3 上运行它(不是选择),我发现我必须按照用户 artsnobASP.NET Forum

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

        一旦我运行了这个,我就可以运行命令行来更新 Web.Optimization。

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

        【讨论】:

          【解决方案10】:

          随便写

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

          【讨论】:

          • @archil 感谢您的替换 - 这将是一个很好的临时解决方案。但主要问题是“为什么脚本不存在?”
          • @Jamie 它应该存在吗?我的意思是,据我记得,那里没有 Scipts 助手。也许您正在尝试使用一些第三方助手?
          • 我自己没有添加该代码 - Visual Studio 2012 RC 在为我的创建操作创建视图时添加了它。我认为不知何故我的 MVC 4 不是正确的。它必须在某个地方工作,因为 Scott Hanselman 提到失败的语法是 MVC 4 RC 的新增功能:hanselman.com/blog/…
          【解决方案11】:

          我从 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)
          }
          

          希望对你有帮助。

          【讨论】:

          • 除非您提供else 子句,否则无需使用if (IsSectionDefined())。您说required: false 的事实已经允许不定义该部分,在这种情况下,该部分将被省略。所以这是不必要的额外代码。
          【解决方案12】:

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

          关于所有开发者。

          【讨论】:

            【解决方案13】:

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

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

            【讨论】:

              【解决方案14】:
              1. :删除查看页面。
              2. :添加命名空间 webconfig(在视图目录中)
              3. :创建视图试试!

              祝你好运……

              【讨论】:

                【解决方案15】:

                还有一个问题 - 花了很长时间试图解决同样的问题 - 即使它是在 web.config 中为 root 和 Views 的根定义的。结果我错误地将它添加到&lt;system.web&gt;&lt;pages&gt;&lt;namespaces&gt;,而不是&lt;system.web**.webPages.razor**&gt;&lt;pages&gt;&lt;namespaces&gt; 元素。

                真的很容易错过!

                【讨论】:

                  【解决方案16】:

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

                  @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) 的引用,一切正常。

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

                  【讨论】:

                    【解决方案17】:

                    这有一个明显的解决方案。我后来也遇到了同样的问题。与Assembly References 或...无关。当您有复杂的页面结构时,它会发生在MVC Partial 视图的层次结构调用中。因此,在每个页面(可能是母版页或部分页面)上分别调用/渲染每个部分将导致看不到页面的所需部分,如以下代码:

                    @RenderSection("Scripts", required: false)
                    

                    这只是强制页面查找和呈现相关部分,并在失败的情况下向您显示像您一样的错误消息。

                    所以我建议你跟踪你的页面(如程序跟踪)从主页面到它的所有部分以检测依赖关系。也许这是一项糟糕的工作,但这里没有其他选择。

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

                    【讨论】:

                      【解决方案18】:

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

                      【讨论】:

                        【解决方案19】:

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

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

                        并从 Edit.cshtml 中删除此代码

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

                        运行程序 inshallah 将与您一起工作。

                        【讨论】:

                          【解决方案20】:

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

                          update-package microsoft.aspnet.mvc -reinstall
                          

                          【讨论】:

                            【解决方案21】:

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

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

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

                            我希望这会有所帮助。 谢谢

                            【讨论】:

                              【解决方案22】:

                              将项目从 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>
                              

                              请务必查看每个 Views 目录中的 Web.Configs。

                              你可以阅读更多关于Upgrading an ASP.NET MVC 3 Project to ASP.NET MVC 4的信息。

                              【讨论】:

                                【解决方案23】:

                                如果你添加到你的 web.config 并且它仍然显示消息,那么你需要关闭你的项目并重新打开它,现在它会存在并且 @Styles.Render("") 和 @Scripts.Render() 将工作很好。

                                【讨论】:

                                  【解决方案24】:

                                  试试这个:

                                  @section Scripts 
                                  {
                                      Scripts.Render("~/bundles/jqueryval")  // <- without ampersand at the begin
                                  }
                                  

                                  【讨论】:

                                    猜你喜欢
                                    • 2017-08-26
                                    • 2013-10-16
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2011-02-21
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多