【问题标题】:Visual Studio 2010, Linq extension methods and framework 3.5Visual Studio 2010,Linq 扩展方法和框架 3.5
【发布时间】:2011-05-08 16:16:21
【问题描述】:

如果我在 web.config 中设置 <compilation targetFramework="4.0">,Visual Studio 2010 会在 ASPX 文件(不是代码隐藏)中显示所有 Linq 扩展方法。但是当我将项目更改为目标 3.5(支持 Linq 扩展方法)时,Visual Studio 会删除 web.config 中前面提到的属性,但 APSX 文件中的 Linq intellisense 也会随之而来。

问题

是否可以说服 Visual Studio 2010 在编辑 ASPX 文件时不要假设并退回到 2.0,因此 Linq 扩展方法仍会列在智能感知下拉列表中?

编辑

正如我在 one of my previous questions 中指出的那样,当我不知道发生了什么时,手动添加程序集和导入命名空间并不能解决问题。

问题再现

要重现此问题,请执行以下操作:

  1. 在 Visual Studio 2010 中打开 Asp.net MVC 项目属性和目标 NetFx 3.5
  2. 打开web.config 并删除targetFramework 属性(如果它仍然存在)。
  3. 在使用 Linq 扩展方法的视图本身 (ASPX) 中编写一些代码(即(new List<string>()).Any(s => string.IsNullOrEmpty()))。您应该会看到 Any 无法被 Visual Studio 2010 识别。
  4. 开始在web.config 中添加一项配置设置。 Any 方法应该没有区别。
  5. <% @ Imports ... %> 添加到视图中。 Any 方法也应该没有区别。

运行应用程序不是问题。它运行并且还执行AnyLinq 扩展方法。没问题。设计时支持是这里的问题。

我的web.config 文件

这是我的 web.config 文件的完整内容,它没有达到预期的效果(我也可以包含注释掉的部分,但这没有任何区别 - 原始 Asp.net MVC 2 项目模板没有'也不包括这些):

<?xml version="1.0"?>
<configuration>

    <system.web>

        <httpHandlers>
            <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
        </httpHandlers>

        <compilation debug="true" batch="true">
            <assemblies>
                <!--
                <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
                <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
                -->
                <add assembly="System.Web.Abstractions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
                <add assembly="System.Web.Mvc, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
            </assemblies>
        </compilation>

        <pages enableViewState="false">
            <controls>
                <add tagPrefix="SharePoint" assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" namespace="Microsoft.SharePoint.WebControls" />
            </controls>
            <namespaces>
                <add namespace="Microsoft.SharePoint"/>
                <add namespace="System.Collections.Generic"/>
                <add namespace="System.Linq"/>
                <add namespace="System.Web.Mvc"/>
                <add namespace="System.Web.Mvc.Html"/>
                <add namespace="System.Web.Routing"/>
                <add namespace="MyApp.Objects"/>
                <add namespace="MyApp.Web.General"/>
                <add namespace="MyApp.Web.Helpers"/>
            </namespaces>
        </pages>

    </system.web>

    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <handlers>
            <remove name="BlockDirectAccessHandler"/>
            <add name="BlockDirectAccessHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
        </handlers>
    </system.webServer>

</configuration>

这是它在 Visual Studio 2010 中的样子。在图像中,您看不到应该紧跟在 &lt;%@ Control ... %&gt; 之后的额外行 &lt;%@ Import Namespace="System.Linq" %&gt;,但我已经尝试过使用和不使用。 system.web/pages/namespaces 无论如何都是全局设置。

【问题讨论】:

    标签: linq visual-studio-2010 .net-3.5 intellisense


    【解决方案1】:

    .NET 4.0 的根 web.config 已将 System.Linq 添加到 system.web/pages/namespaces。 .NET 3.5 的情况并非如此,尽管它包含 Linq 库,但出于向后兼容的原因并未对根 web.config 进行更改,因此您必须将其添加到 web.config 中的 system.web/pages/namespaces .

    ASP.NET Configuration File Hierarchy and Inheritance

    【讨论】:

    • 不。这行不通。检查我的问题的 edit 部分,我在其中进一步澄清了一些事情。
    • @Robert Koritnik:无法重现问题,错误信息是什么?
    • 没有错误。 Linq 扩展方法只是没有出现在智能感知下拉列表中......即使我手动将它们写下来,它们也带有弯曲的红色下划线,这意味着 Visual Studio 无法识别它们。如果我确实添加了imports,或者甚至添加了我在另一个问题中描述的所有这些元素(在本问题上面引用),那么没有区别。
    • @Max Toro:我添加了重现上述问题的步骤。
    • @Robert Koritnik:Linq 需要 System.Core,为什么要注释掉?
    【解决方案2】:

    我认为这是因为 LINQ 被假定包含在 4.0 框架中。对于旧版本,您可以通过将其添加到顶部的每个 ASPX 页面来手动导入 LINQ 命名空间:

    <%@ Import Namespace="System.Linq" %>
    

    或者如果你不想在每个文件中都这样做,你可以put it in your web.config

    编辑 - 正如其他人所指出的那样,您的问题可能来自您的 web.config 中的 System.Core 注释,这是这些扩展方法所必需的。

    【讨论】:

    • 我很抱歉没有在我的问题中添加足够的信息,但我添加了编辑部分,我在其中添加了问题的链接,证明添加程序集和导入命名空间没有任何作用。
    • 取消注释没有任何区别。
    【解决方案3】:

    包括System.Core 组件当然很重要。但是不做任何事情就是你不做接下来的事情。

    要使 Visual Studio 2010 中的一切都按预期运行(以及在框架 3.5 下),您还必须在 web.config 中添加 &lt;system.codedom&gt; 配置元素。这是缺少的部分:

    <system.codedom>
        <compilers>
            <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
                <providerOption name="CompilerVersion" value="v3.5"/>
                <providerOption name="WarnAsError" value="false"/>
            </compiler>
        </compilers>
    </system.codedom>
    

    【讨论】:

    • 对。有趣的是,您的项目在没有它的情况下编译。顺便说一句,如果您在“属性”页面上更改目标框架,VS 会为您添加。
    • 确实如此。但如前所述,我已经清理了我的web.config,因为我的应用程序不是独立的 Web 应用程序,而是在现有的 Sharepoint 网站下运行(只是作为虚拟文件夹,而不是作为虚拟文件夹应用程序)。所以我不得不从我的web.config 中删除很多内容,只保留相关部分。为什么编译不出来?所有有问题的都是视图的一部分,默认情况下直到运行时才编译。由于我在站点的根目录web.config 中进行了这些设置,因此我也没有遇到任何运行时错误。
    猜你喜欢
    • 2011-07-21
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多