В представлении на основе Razor не отображаются ссылочные сборки

Я пытаюсь создать строго типизированное представление, основанное на классе из другой сборки. По какой-то причине, однако, мое представление Razor, похоже, не имеет видимости других собраний, упомянутых в моем проекте. например.

@model MyClasses.MyModel

приводит к ошибке в Visual Studio 2010, "Тип или имя пространства имен MyClasses не может быть найден (вам не хватает директивы using или ссылки на сборку?).

Тот же класс, на который ссылается стандартный движок просмотра, отлично работает. У меня такая же проблема, когда я пытаюсь ссылаться на класс в теле моего представления.

Мне не хватает чего-то о Razor или мне нужно ссылаться на сборку каким-то другим способом?

Ответ 1

Существует новый раздел конфигурации, который используется для ссылки на пространства имен для представлений Razor.

Откройте файл web.config в папке Views и убедитесь, что он имеет следующее:

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

    <system.web.webPages.razor>
        <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.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" />
                <add namespace="SquishIt.Framework" />
                <add namespace="Your.Namespace.Etc" />
            </namespaces>
        </pages>
    </system.web.webPages.razor>
</configuration>

В качестве альтернативы вы можете добавить с помощью операторов в свой общий макет:

@using Your.Namespace.Etc;
<!DOCTYPE html>
<head>
....

После редактирования Web.config перезапустите Visual Studio, чтобы применить изменения.

Ответ 2

У меня была та же проблема: MVC3 Project MyCore.Web ссылался на пространство имен MyCore.DBLayer из другого проекта в том же решении (с именем сборки MyCoreDBLayer). Все объекты из MyCore.DBLayer отлично работали в контроллерах и моделях, но не выполнялись в представлениях Razor с ошибкой "Тип или имя пространства имен" DBLayer "не существует в пространстве имен" MyCore "(вам не хватает ссылки на сборку?)", Которая была очевидно, не тот случай.

  • Скопировать локальную опцию было установлено значение true.
  • Добавление утверждений "using..." в представлениях Razor было бесполезным
  • Добавление пространств имен в раздел system.web.webPages.razor также бесполезно

Добавление сборки referecene в раздел system.web/компиляции/сборки корневого файла web.config устраняет проблему. Раздел теперь выглядит следующим образом:

<system.web>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        **<add assembly="MyCoreDBLayer" />**
      </assemblies>
    </compilation>
...
</system.web>

Опустить версию, культуру, токен в настоящее время все в порядке, но нужно исправлять ее в будущем.

Ответ 3

В моем случае отдельный проект, содержащий пространство имен, был консольным приложением. Исправлена ​​проблема с изменением его в библиотеке классов.

Ответ 4

Ни одно из вышеперечисленных не работало для меня:

  • У Dll установлено значение Копировать локальную
  • Добавление пространств имен в web.configs ничего не делало
  • Добавление ссылок на сборку system.web\compilation\assemblylies также не помогло (хотя я не удалял эти ссылки, поэтому может быть и то, что они тоже нужны)

Но я наконец нашел что-то, что сработало для меня:

Это было связано с тем, что у меня был сборка Build to bin\Debug\для конфигурации Debug и конфигурации bin\Release\for Release. Как только я изменил конфигурацию Build Configuation на "bin \" для всех конфигураций (как показано на рисунке ниже), все начало работать так, как должно быть.

Build Configuration

Я понятия не имею, почему разделение ваших сборников на папки выпуска и отладки должно приводить к разрыву синтаксиса Razor, но похоже, что что-то не удалось найти в сборках. Для меня проекты, имеющие проблемы с синтаксисом бритвы, на самом деле являются моими проектами "бритвенной библиотеки". Они настроены как проекты приложений, но я использую их как библиотеки классов с RazorGenerator для компиляции моих просмотров. Когда я на самом деле пытался запустить один из этих проектов, он вызвал следующую ошибку конфигурации:

Не удалось загрузить файл или сборку "System.Web.Helpers, Version = 3.0.0.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 'или одна из ее зависимостей. Система не может найти указанный файл.

Это привело меня к попытке изменить Build Output, поскольку я заметил, что для всех веб-проектов Build Output, кажется, всегда находится непосредственно в папке bin, в отличие от стандартного для библиотек классов, которые имеют как папки выпуска, так и отладки.

Ответ 5

Кажется, вы ищете этот ответ: fooobar.com/questions/12906/...

То есть, откройте внутренний Views\Web.Config(НЕ корневой) и добавьте пространство имен в теге Pages:

<system.web.webPages.razor>
  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory.../>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="System.Web.Mvc" />
      ...
      <add namespace="System.Web.Routing" />
      <!-- Your namespace here -->
    </namespaces>

Сохраните это, затем закройте и снова откройте файл Razor.

Если вы используете области, вам нужно сделать это для каждого Web.Config в каждом регионе.

С годами Visual Studio стала более грубой, поэтому может потребоваться закрыть файл Razor с помощью сборки Debug, а затем снова открыть файл Razor или может потребоваться перезагрузка Visual Studio. Но в конечном итоге он представит вам файл Razor, как если бы все в списке имен было в @using заявлениях в верхней части всех ваших представлений.

Ответ 6

В ASP.NET Core MVC решение состоит в том, чтобы добавить using в _ViewImports.cshtml, вместо того, чтобы поместить его в папку просмотра при работе с ASP.NET MVC 5.

_ViewImports.cshtml

@using mySolution
@using mySolution.ViewModels // <-- Add this, and place your ViewModel (e.g. LoginViewModel) in here.
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Просмотр

@model LoginViewModel // Add to _ViewImports to make this line work
<div>This is the View for the login screen.</div>

Ответ 7

Я получал ту же ошибку при попытке использовать объекты Smo в представлении Razor. По-видимому, это связано с тем, что Razor не может найти DLL, упомянутые в проекте. Я решил это, установив для параметра "Копировать локальное" значение true для всех библиотек Smo, однако может быть лучшее решение (см. Ссылку Czechdude выше) Редактирование @using и web.config бесполезно, потому что они необходимы, только если вы хотите опустить часть пространства имен из имен типов (например, Server вместо Microsoft.SqlServer.Management.Smo.Server)

Ответ 8

Я получал подобную ошибку после того, как переместил мою машину с Win7 32bit на Win7 64bit. Сообщение об ошибке:

...\Web\Views\Login.cshtml: ASP.net runtime error: [A]System.Web.WebPages.Razor.Configuration.HostSection cannot be cast to [B]System.Web.WebPages.Razor.Configuration.HostSection. Type A originates from System.Web.WebPages.Razor, Version=1.0.0.0 ... Type B originates from ... Version=2.0.0.0

Оказывается, у меня были обе версии в GAC. В представлении web.config указано v1, но приложение ссылалось на v2. Удалены ссылочные сборки и добавлены v1. System.Web.WebPages.Razor и т.д.

Ответ 9

ну, для меня это было иначе. Мне не удалось собрать проект консольного приложения с проектом MVC. Поэтому добавить ссылку было недостаточно.

Хорошо, это может помочь кому-то другому. перейдите в корневой файл web.config system.webcompilation → добавьте ссылку на проект, как это.

<assemblies> <add assembly="Your.Namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> </assemblies>

Ответ 10

У меня также была такая же проблема, но проблема заключалась в Целевой структуре сборки.

Связанная сборка была в .NET Framework 4.6, где проект установлен в .NET framework 4.5.

Надеюсь, это поможет кому-то, кто испортил рамки.

Ответ 11

Попробуйте добавить пространство имен, которое ваш MyClasses находится в файле web.config под

<pages> <namespaces></namespaces> </pages>

Ответ 12

включает полное пространство имен

@model namespace.myclasses.mymodel

Ответ 13

Ни один из этих fooobar.com/questions/67461/... не работает для меня. Даже "добавление сборки referecene в раздел system.web/компиляция/сборка корневого файла web.config". Таким образом, для меня два способа: 1) добавить класс публичной обмотки для моей сборки, который код Razor может получить доступ к этой сборке через этот обертку; 2) просто добавьте логику сборки в открытый класс в той же сборке, где находится код Razor.

Ответ 14

В дополнение к изменениям web.config для <assemblies> и <namespaces>, я обнаружил, что GAC-сборка имеет большое значение. Вы можете применять культуру и токен открытого ключа, как и любую основную сборку .NET, которая зарегистрирована глобально.

Некоторые могут содрогнуться при упоминании GAC. Но как разработчик BizTalk я вырос, чтобы охватить его.

Ответ 15

в моделях пространственных имен, yourClassModel, добавить публикацию перед классом классов

открытый класс yourClassModel {   подпирать }

Ответ 16

Это решение сработало для меня (это смешно, но работает)

Я редактировал страницы просмотра и копировал содержимое и вставлял в него, я не менял никакого содержания просмотров, но просто редактировал, чтобы визуальная студия могла делать это, чтобы отслеживать страницы, а потом все начинало работать

Решение. Просто отредактируйте страницы и замените их теми же страницами (Работа для меня)

Ответ 17

Ваше имя проекта FOLDER должно быть одинаковым. Если ваше имя проекта или решения отличается от других, то MVC повредит вам.

Пример. Если вы создаете новое приложение и получаете имя по умолчанию Webapplicaiton1, это пространство имен будет создано. Итак, скажем, что вы не хотите иметь это пространство имен, поэтому из VS вы меняетесь повсюду, вы можете увидеть "MyNamespace". Вы также выполняете поиск и замену всего кода из "Webapplication1" и заменяете его "MyNamespace". Это также изменяет файл web.config, так что он внедряет

Теперь все будет работать, кроме просмотров Razor.

RazorViews не может найти его, потому что есть какая-то странная зависимость от FOLDERNAME проекта. Это ужасный дизайн.

Я проверил это полу-основательно, скопировав мои файлы в новое решение, и единственное отличие - имя папки.