Перегляд на основі бритви не бачить посилань


101

Я намагаюся створити сильно набраний вид на основі класу з іншої збірки. З якої б то не було причини, на мій погляд на Бритву, схоже, немає видимості інших збірок, посилаються на мій проект. напр

@model MyClasses.MyModel

призводить до помилки в Visual Studio 2010: " MyClassesНе вдалося знайти ім'я типу чи простору імен (ви не використовуєте директиву чи посилання на збірку?").

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

Я щось бракую про Razor або мені потрібно посилатися на збірку якимось іншим способом?


Ви використовуєте весь простір імен? @model namespace.myclasses.mymodel, можливо?
Брецький

Відповіді:


107

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


18
Це працює, проте переконайтеся, що на ваші збори посилаються Copy Local = true. Зовнішні збори можуть не працювати інакше.
Террі

1
Тут слід зазначити, що якщо ви використовуєте представлення з "віртуального" джерела (наприклад, БД) замість реальних файлів перегляду, ви повинні помістити це у файл ROOT web.config, щоб код у представленнях працював.
NightOwl888

2
@Terry, виявляється, що Copy local = true потрібна навіть для деяких збірок, розміщених з кореневими іменами System.
Дан Еспарза

2
Мої збірки завантажуються під час виконання, тому я не можу використовувати файл web.config для їх додавання. Чи можна ще щось спробувати? Чи є спосіб імпортувати мої зовнішні погляди за допомогою власних файлів web.config? Це досить дивно, оскільки я посилаюсь на простори імен в межах тієї ж збірки, що і мої погляди.
Максим Ві.

Перезапуск Visual Studio не потрібен. Досить просто закрити та повторно відкрити Перегляди.
user247702

58

У мене була така ж проблема: MVC3 Project MyCore.Web посилався на простір імен MyCore.DBLayer з іншого проекту в тому ж самому рішенні (з назвою збірки MyCoreDBLayer). Усі об'єкти з MyCore.DBLayer прекрасно працювали в контролерах та моделях, але не вдалося в представленнях Razor із помилкою "Назва або назва простору імен" DBLayer "не існує в просторі імен" MyCore "(не вистачає посилання на збірку?)", Яка була очевидно, не так.

  • Параметр Copy Local був встановлений на true.
  • Додавання виразів "використання ..." у видах Razor було марним
  • Додавання просторів імен до розділу system.web.webPages.razor також було марним

Додавання референцена збірки до розділу 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>

Опущення версії, культури, лексеми наразі було нормальним, але його слід виправити в майбутньому.


Це рішення працює, але це погана ідея. Коли я зробив усі свої заняття внутрішніми та зробив веб-асамблею другом MyCoreDBLayer, він перестав працювати. Я закінчив писати громадські заняття як модель MVC, яка обгортала мої класи з друзів. Я вважаю, що не слід використовувати інші класи, що з простору імен моделей MVC у видах Razor - завжди можна написати обгортку
VB

Це працювало для мене, я намагався додати його до, Views/web.configі він працював, коли його також помістили.
guanome

18

У моєму випадку окремим проектом, який містив простір імен, було додаток консолі. Змінивши його на бібліотеку класів, виправили цю проблему.


1
Це вирішило це для мене. Спочатку я спробував створити бібліотеку класів (Package), але зіткнувся з проблемами, пов'язаними з необхідним пакетом, який мені потрібен. Краще не захоплюватися і просто створити базову бібліотеку класів (DLL)
redwards510

15

Жоден із перерахованого вище не працював і для мене;

  • Dlls було встановлено на Copy Local
  • Додавання просторів імен до обох web.configs нічого не зробило
  • Додавання посилань на збірку до system.web \ compilation \ assemblies також не допомогло (хоча я не видалив ці посилання, тому, можливо, вони теж потрібні)

Але я нарешті знайшов щось, що працювало на мене:

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

Конфігурація побудови

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

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

Це підштовхує мене до спроби змінити вихідний збір, оскільки я помічаю, що для всіх веб-проектів здається, що вихідний вихід завжди знаходиться безпосередньо у папці bin, на відміну від бібліотек класів за замовчуванням, у яких є папки випуску та налагодження.


1
Підтвердили тим, що вам не потрібно мати розділ system.web \ compilation \ assemblies, коли знаходяться безпосередньо в папці bin. Це може повернутися до просто <компіляції налагодження = "справжній" targetFramework = "4.5.1" />
Сильвія

2
Свята корова! Після довгих пошуків рішення це остаточно вирішило мої погляди на Razor у проекті бібліотеки класів !! Дуже дякую.
Хулла

2
Неймовірно! Я будував свою бібліотеку класів переглядів до каталогу іншого проекту і мав цю проблему. Шлях побудови повинен бути bin \, щоб це працювало. Тепер замість цього використовуйте x xpy post build.
GlacialSpoon

1
Я використовую двигун Razor в проекті бібліотеки класів і зіткнувся з тим же питанням. Встановлення вихідного шляху на "бін \" вирішило і це питання для мене. Як і GlacialSpoon, я копіюю збірку на етапі після збирання у потрібну папку виводу. Не найкращий спосіб, але, принаймні, працює Intellisense, посилаючись на збірки та виділення синтаксису.
октоат

Варто зазначити, що оригінальна проблема виникає, якщо ваш власний каталог вихідних даних вказує на батьківський каталог ala '.. \ some \ dir \'. Але якщо змінити вихідний каталог на "some \ dir \", тоді все працює добре. Це диявольський глюк у матриці точно.
XDS

7

Ви, здається, шукаєте цю відповідь: 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.

Якщо ви використовуєте області, вам потрібно буде зробити це для кожного Web.Config у кожній області.

Visual Studio за останні роки набув помилок, тому може зажадати закриття файлу Razor, який виконує збірку налагодження, а потім повторне відкриття файлу Razor, а в гіршому випадку може вимагати перезавантаження Visual Studio. Але в кінцевому підсумку він представить вам файл Razor так, ніби все, що в списку просторів імен, було у висловлюваннях @using вгорі всіх ваших переглядів.


4

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

3

Для мене я посилався на проект, який був консольним додатком. Він був створений для побудови як exe (консольний додаток) замість бібліотеки класів (DLL). Коли я змінив це, я зміг побачити моделі цього окремого проекту без проблем.


Спасибі @ user1619480, у мене була така ж проблема, і в моєму випадку з бібліотеки .Net Framework Class я додав за допомогою VS 2017, і чомусь типом виводу було додаток Console.
danfer

1

Я отримував таку саму помилку під час спроби використання об'єктів Smo у поданні Бритви. Мабуть, це тому, що Razor не може знайти DLL, на які посилається проект. Я вирішив це, встановивши "Копіювати локальне" на true для всіх Smo-dll, однак може бути кращим рішенням (див. Посилання Чехії вище). частина від імен типів (наприклад, Сервер замість Microsoft.SqlServer.Management.Smo.Server)


1

Я отримав аналогічну помилку після переміщення моєї розробленої машини з 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і т.д.


+1 thx це був мій останній пункт, тепер я можу налагодити asp.net mvc 4 hohoho!
citykid

1

ну, для мене це було інакше. Мені не вистачало складання проекту моєї консольної програми з проектом MVC. Отже, додавання посилання було недостатньо.

ну це може допомогти комусь іншому. перейдіть до кореневого файлу web.config system.web-> compilation-> додайте посилання на проект так.

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


1

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

Посилальна збірка була в .NET Framework 4.6, де проект встановив .NET Framework 4.5.

Сподіваюсь, це допоможе тому, хто заплутався в рамках.


1

Назва вашої папки проекту має бути однаковим. Якщо назва вашого проекту чи рішення різна, MVC зашкодить вам.

Приклад: Якщо ви створили нову програму, і вона отримає ім'я за замовчуванням Webapplicaiton1, тоді буде створено цей простір імен. Отже, скажімо, що ви не хочете мати цей простір імен, тому з VS ви змінюєте всюди, де ви можете бачити "MyNamespace". Ви також шукаєте та замінюєте весь код із "Webapplication1" та замінюєте його "MyNamespace". Це також змінює файл web.config, щоб він включався

Тепер все спрацює, крім поглядів на бритвах.

RazorViews не може його знайти, оскільки існує якась дивна залежність від FOLDERNAME проекту. Це жахливий дизайн.

Я це напів ретельно перевірив, скопіювавши свої файли в нове рішення, і різницею було лише ім'я папки.


Неймовірно, як це глузування! Я перейменував ім'я папки проекту в праве, і відкрив рішення в текстовому файлі та виправив опис папки! Це спрацювало! Я використовую візуальну студію 2019
Даніель,

0

Спробуйте додати простір імен, які ви MyClassesперебуваєте, до веб.config під

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



0

Жоден із цих https://stackoverflow.com/a/7597360/808128 не працює для мене. Навіть "додавання референцена збірки до розділу system.web / компіляція / складання кореневого файлу web.config". Тож для мене залишається два способи: 1) додати загальнодоступний клас обгортання для моєї збірки, щоб код Razor міг отримати доступ до цієї збірки через цю обгортання; 2) просто додайте логіку складання до публічного класу в тій же збірці, де знаходиться код Razor.


0

Окрім внесення змін до web.config для <assemblies>та<namespaces> я виявив , що GAC'ing збірка зробив велику різницю. Ви можете застосовувати культуру та маркер відкритого ключа, як і будь-яка основна збірка .NET, яка зареєстрована в усьому світі.

Деякі можуть здригнутися від згадки про GAC. Але як розробник BizTalk я вирішив сприйняти це.


0

Це рішення працювало для мене (Це смішно, але працює)

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

Рішення - просто відредагуйте сторінки та замініть ті самі сторінки (працювали для мене)



0

У моєму випадку пакет, який я намагався використати, посилався на .net стандарт 2.1, тоді як мій проект бібліотеки класів бритв був встановлений на 2,0

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.