Представление на основе Razor не видит ссылочных сборок



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



@model MyClasses.MyModel


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



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



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

918   18  

18 ответов:

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

открыть в своем 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 в общий макет:

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

после редактирования веб-страниц.конфигурации, перезапустите Visual Studio, чтобы применить изменения.

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

  • копировать Для параметра Local было установлено значение true.
  • добавить "с помощью..."заявления в Razor views были бесполезны
  • добавление пространств имен в системе.сеть.страницы.бритва раздел был бесполезен, а также

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

<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>

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

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

ни один из выше работал для меня;

  • DLL были установлены для копирования Local
  • добавление пространств имен в веб.конфиг ничего не сделал
  • добавление ссылок на сборки в систему.web\compilation\assemblies также не помогли (хотя я не удалил эти ссылки, так что может быть, что они тоже нужны)

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

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

Build Configuration

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

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

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

вы, кажется, ищете этот ответ: https://stackoverflow.com/a/4136773/176877

то есть откройте внутренние представления\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.

Если вы используете области, вам нужно будет сделать это для каждого веб-сайта.Конфиг в каждой области.

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

In ASP.NET Core MVC решение состоит в том, чтобы добавить using в _ViewImports.cshtml, вместо того, чтобы положить его в интернете.конфигурация в папке 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

View

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

Я получал ту же ошибку при попытке использовать объекты Smo в представлении Razor. По-видимому, это связано с тем, что Razor не может найти библиотеки DLL, на которые ссылается проект. Я решил эту проблему, параметр "копировать локально" в true для всех СМО библиотек, однако там может быть лучшим решением (см. Czechdude по ссылке выше) @использование и веб.изменения конфигурации бесполезны, потому что они необходимы только в том случае, если вы хотите опустить часть пространства имен из имен типов (например, сервер вместо Microsoft.От SQLServer.Управление.модель SMO.Сервер)

я получал аналогичную ошибку после перемещения моей машины dev из 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 и т. д.

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

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

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

У меня тоже была такая же проблема, но проблема была с целевая структура сборки.

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

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

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

попробуйте добавить пространства имен MyClasses находится в сети.конфигурация под

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

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

@model namespace.myclasses.mymodel

ни один из них https://stackoverflow.com/a/7597360/808128 Работайте на меня. Даже " добавление сборки referecene к системе.веб/компиляции/сборки в разделе Интернет.конфигурационный файл." Таким образом, для меня остается два способа: 1) добавить открытый класс wrap для моей сборки, который код Razor может получить доступ к этой сборке через этот wrap; 2) просто добавьте логику сборки в открытый класс в той же сборке, где находится код Razor.

В дополнение к созданию веб -.изменения конфигурации для <assemblies> и <namespaces>, Я обнаружил, что gac'ING сборки сделал большую разницу. Вы можете применить язык и региональные параметры и маркер открытого ключа, как и любая базовая сборка .NET, зарегистрированная глобально.

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

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

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

решение - просто отредактируйте страницы и замените на те же страницы (работал для меня)

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

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

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

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

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

в моделях spacename, yourClassModel, добавьте public перед именем class

public class yourClassModel{
    prop
}

Comments

    Ничего не найдено.