Visual Studio 2010, методы расширения Linq и фреймворк 3.5 - PullRequest
1 голос
/ 11 ноября 2010

Если я установлю <compilation targetFramework="4.0"> в web.config, Visual Studio 2010 отображает все методы расширения Linq в файлах ASPX (не в коде).Но когда я изменяю свой проект на целевой 3.5 (который поддерживает методы расширения Linq), Visual Studio удаляет ранее упомянутый атрибут в web.config, но IntelliSense Linq в файлах APSX также идет с ним.

Вопрос

Можно ли убедить Visual Studio 2010 не принимать и не использовать 2.0 при редактировании файлов ASPX, поэтому методы расширения Linq все равно будут перечислены в раскрывающемся списке intellisense?

Редактировать

Вручнуюдобавление сборок и импорт пространств имен не работает, как я уже отмечал в одном из моих предыдущих вопросов , когда я не знал, что происходит.

Проблема воспроизведения

Чтобы воспроизвести эту проблему, выполните следующие действия:

  1. В Visual Studio 2010 откройте свойства проекта MVC Asp.net и выберите NetFx 3.5
  2. Откройте web.config и удалите *Атрибут 1022 *, если он все еще там.
  3. Напишите некоторый код в самом представлении (ASPX), использующем метод расширения Linq (т. Е. (new List<string>()).Any(s => string.IsNullOrEmpty())).Вы должны увидеть, что Any не распознается Visual Studio 2010.
  4. Начните добавлять один параметр конфигурации за одним в web.config.Не должно быть никакой разницы в методе Any.
  5. Добавьте <% @ Imports ... %> в представление.Не должно быть никакой разницы и в методе Any.

Запуск приложения не является проблемой.Он запускается и также выполняет Any метод расширения Linq.Нет проблем с этим.Здесь возникает проблема с поддержкой времени разработки.

Мой 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. Визображение, которое вы не видите дополнительной строки <%@ Import Namespace="System.Linq" %>, которая должна быть сразу после <%@ Control ... %>, но я пробовал с и без.В любом случае, system.web/pages/namespaces - это глобальная настройка для этого.

alt text

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

В корневой web.config для .NET 4.0 добавлено System.Linq к system.web/pages/namespaces. Это не относится к .NET 3.5, которая, хотя и включает библиотеку Linq, не внесла изменений в корневой web.config по причинам обратной совместимости, поэтому вы должны добавить ее к system.web/pages/namespaces в вашем web.config .

См. Иерархия и наследование файлов конфигурации ASP.NET

2 голосов
/ 11 ноября 2010

Я думаю, это потому, что предполагается, что LINQ будет включен в структуру 4.0. Для более старых версий вы можете вручную импортировать пространство имен LINQ, добавив его на каждую страницу ASPX вверху:

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

Или, если вы не хотите делать это в каждом файле, вы можете поместить его в свой файл web.config .

Редактировать. Как указывалось другими, ваша проблема может быть связана с тем, что вы закомментировали System.Core из файла web.config, что требуется для этих методов расширения.

0 голосов
/ 14 ноября 2010

Включая System.Core сборка, конечно, важна. Но ничего не делает, ты тоже не делаешь следующее.

Чтобы все работало в Visual Studio 2010 должным образом (и в рамках 3.5), вы также должны добавить <system.codedom> элемент конфигурации в web.config. Это та часть, которая отсутствовала:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...