Основанное на бритве представление не видит ссылочные сборки - PullRequest
96 голосов
/ 10 февраля 2011

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

@model MyClasses.MyModel

приводит к ошибке в Visual Studio 2010: «Не удалось найти тип или имя пространства имен MyClasses (отсутствует директива using или ссылка на сборку?).»

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

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

Ответы [ 18 ]

104 голосов
/ 10 февраля 2011

Существует новый раздел конфигурации, который используется для ссылки на пространства имен для представлений 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, чтобы применить изменения.

54 голосов
/ 29 сентября 2011

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

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

Добавлениесборка, ссылка на раздел system.web / compilation / assembly в корневом файле 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>

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

18 голосов
/ 03 ноября 2014

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

12 голосов
/ 29 октября 2013

Ничего из вышеперечисленного у меня тоже не сработало;

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

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

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

Build Configuration

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

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

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

6 голосов
/ 05 июня 2012

Похоже, вы ищете этот ответ: https://stackoverflow.com/a/4136773/176877

То есть откройте внутренний 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 в верхней части всех ваших просмотров.

3 голосов
/ 10 апреля 2018

Для меня я ссылался на проект, который был консольным приложением. Он был настроен на сборку как exe (консольное приложение) вместо библиотеки классов (DLL). Когда я изменил это, я смог увидеть модели из этого отдельного проекта без проблем.

2 голосов
/ 14 декабря 2016

В ASP.NET Core MVC решение заключается в добавлении using в _ViewImports.cshtml вместо помещения его web.config в папку View при работе с 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>
1 голос
/ 04 августа 2017

У меня тоже была такая же проблема, но проблема была с Target Framework сборки .

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

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

1 голос
/ 21 июня 2017

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

ну, это может помочь кому-то еще.перейдите в корневой файл web.config system.web -> compilation -> добавьте ссылку на свой проект следующим образом.

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

1 голос
/ 28 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...