Jilet tabanlı görünüm başvurulan derlemeleri görmüyor


101

Başka bir derlemedeki bir sınıfa dayalı olarak türü kesin belirlenmiş bir görünüm oluşturmaya çalışıyorum. Her ne sebeple olursa olsun, Razor görünümüm, projemde başvurulan diğer derlemelerin görünürlüğüne sahip görünmüyor. Örneğin

@model MyClasses.MyModel

Visual Studio 2010'da "Tür veya ad alanı adı MyClassesbulunamadı (bir kullanma yönergesi veya bir derleme başvurusu eksik mi?)" hatasıyla sonuçlanır .

Standart görünüm motorunda atıfta bulunulan aynı sınıf iyi çalışıyor. Benim görüşüme göre sınıfa atıfta bulunmaya çalışırken aynı sıkıntıyı yaşıyorum.

Razor ile ilgili bir şey mi eksik yoksa montaja başka bir şekilde başvurmam gerekiyor mu?


Ad alanının tamamını mı kullanıyorsunuz? @model namespace.myclasses.mymodel, belki?
Brettski

Yanıtlar:


107

Razor görünümleri için ad alanlarına başvurmak için kullanılan yeni bir yapılandırma bölümü vardır.

web.configDosyayı Viewsklasörünüzde açın ve şunlara sahip olduğundan emin olun:

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

Alternatif olarak, paylaşılan düzeninize kullanım ifadeleri ekleyebilirsiniz:

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

Web.config dosyasını düzenledikten sonra, değişiklikleri uygulamak için Visual Studio'yu yeniden başlatın.


18
Bu çalışır, ancak montajlarınıza ile başvurulduğundan emin olun Copy Local = true. Dış montajlar başka türlü çalışmayabilir.
Terry

1
Burada, gerçek görünüm dosyalarını kullanmak yerine "sanal" bir kaynaktan (DB gibi) görünümler kullanıyorsanız, görünümlerdeki kodun çalışması için bunu ROOT web.config dosyasına koymanız gerektiğine dikkat edilmelidir.
NightOwl888

2
@Terry, bazı Sistem kökü ad alanlı derlemeleri için bile Copy local = true gerekli görünüyor.
Dan Esparza

2
Derlemelerim çalışma zamanında yüklendi, bu yüzden onları eklemek için web.config dosyasını kullanamıyorum. Deneyebileceğim başka bir şey var mı? Harici görünümlerimi kendi web.config dosyalarıyla içe aktarmanın bir yolu var mı? Oldukça tuhaf, çünkü görünümlerimle aynı derlemede ad alanlarına atıfta bulunuyorum.
Maksim Vi.

Visual Studio'nun yeniden başlatılması gerekli değildir. Görünümleri kapatmanız ve yeniden açmanız yeterlidir.
user247702

58

Aynı sorunu yaşadım: MVC3 Projesi MyCore.Web, aynı çözümdeki (derleme adı MyCoreDBLayer) başka bir projeden MyCore.DBLayer ad alanına başvuruyordu. MyCore.DBLayer bütün nesneler Kontrolörleri ve Modeller mükemmel çalıştı ama bir hata ile Tıraş görünümlerinde başarısız dblayer MYCORE 'ad alanında yok ' 'tür veya ad alanı adı''(bir derleme başvurusu eksik?)' Hangi belli ki durum böyle değil.

  • Yerel Kopyala seçeneği doğru olarak ayarlandı.
  • Razor görünümlerine "using ..." ifadeleri eklemek işe yaramazdı
  • System.web.webPages.razor bölümüne ad alanları eklemek de işe yaramazdı

Kök web.config dosyasının system.web / compilation / assemblies bölümüne assembly referecene eklenmesi sorunu çözdü. Bölüm artık şöyle görünüyor:

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

Sürüm, kültür, belirteç atlamak şimdilik sorun değildi, ancak gelecekte düzeltilmesi gerekiyor.


Bu çözüm işe yarıyor ama kötü bir fikir. Tüm sınıflarımı dahili yaptığımda ve Web derlemesini MyCoreDBLayer için bir arkadaş yaptığımda, çalışmayı durdurdu. Arkadaş meclislerinden sınıflarımın etrafını saran bir MVC modeli olarak genel bir sınıf yazdım. Razor görünümlerinde MVC'nin model ad alanından başka sınıflar kullanılmaması gerektiğine inanıyorum - bir sarmalayıcı yazmak her zaman mümkündür
VB

Bu benim için çalıştı, onu eklemeye çalıştım Views/web.configve oraya yerleştirildiğinde de çalıştı.
guanome

18

Benim durumumda, ad alanını içeren ayrı proje bir Konsol Uygulamasıydı. Bunu bir Sınıf Kitaplığı olarak değiştirmek sorunu çözdü.


1
Bu benim için çözdü. Önce Sınıf Kitaplığı (Paket) yapmayı denedim, ancak ihtiyacım olan bir nuget paketine başvururken sorunlarla karşılaştım.
Süslenmemek

15

Yukarıdakilerin hiçbiri benim için de işe yaramadı;

  • Dll'ler Yerel Kopyala olarak ayarlandı
  • Her iki web.configs'e ad alanı eklemek hiçbir şey yapmadı
  • System.web \ compilation \ assemblies'a derleme başvuruları eklemek de yardımcı olmadı (bu başvuruları kaldırmadım, bu yüzden onlara da ihtiyaç duyulabilir)

Ama sonunda benim için çalışan bir şey buldum:

Bunun nedeni, Derleme Çıktımın Debug yapılandırması için bin \ Debug \ ve Release yapılandırmaları için bin \ Release \ konumuna gitmesiydi. Derleme Yapılandırmasını Tüm yapılandırmalar için "bin \" olarak değiştirir değiştirmez (aşağıdaki görüntüye göre), her şey olması gerektiği gibi çalışmaya başladı !!!

Yapılandırmayı Oluştur

Derlemelerinizi Release ve Debug klasörlerine ayırmanın neden Razor sözdiziminin bozulmasına neden olması gerektiğine dair hiçbir fikrim yok, ancak bir şey derlemeleri bulamadığı için görünüyor. Benim için jilet sözdizimi sorunları olan projeler aslında benim 'ustura kitaplığı' projelerim. Uygulama Projeleri olarak ayarlandılar ancak bunları, görüşlerimi derlemek için RazorGenerator ile sınıf kitaplıkları olarak kullanıyorum. Aslında bu projelerden birini doğrudan çalıştırmayı denediğimde aşağıdaki Yapılandırma hatasına neden oldu:

Dosya veya derleme 'System.Web.Helpers, Version = 3.0.0.0, Culture = nötr, PublicKeyToken = 31bf3856ad364e35' veya bağımlılıklarından biri yüklenemedi. Sistem belirtilen dosyayı bulamıyor.

Bu, hem yayınlama hem de hata ayıklama klasörlerine sahip sınıf kitaplıkları için varsayılanın aksine, tüm web projeleri için Derleme Çıktısının her zaman doğrudan bin klasöründe göründüğünü fark ettiğim için, Derleme Çıktısını değiştirmeye çalışmamı sağladı.


1
Dll'ler doğrudan bin klasöründeyken system.web \ compilation \ assemblies bölümüne sahip olmanız gerekmediğini bu şekilde onaylayın. Bu, <compilation debug = "true" targetFramework = "4.5.1" />
Sylvia

2
Kutsal inek! Bir çözüm ararken uzun zaman geçirdikten sonra, bu nihayet bir sınıf kitaplığı projesinde Razor görünümlerimi çözdü! Çok teşekkür ederim.
Hullah

2
Inanılmaz! Sınıf kitaplığımı başka bir projenin dizinine oluşturuyordum ve bu sorunu yaşadım. Bunun çalışması için derleme yolunun bin \ olması gerekir. Şimdi bunun yerine post build xcopy kullanılıyor.
GlacialSpoon

1
Razor Engine'i bir sınıf kitaplığı projesinde kullanıyorum ve aynı sorunla karşılaştım. Çıktı yolunu "bin \" olarak ayarlamak bu sorunu benim için de çözdü. GlacialSpoon gibi derlemeyi bir derleme sonrası adımında doğru çıktı klasörüne kopyalıyorum. En iyi yol değil, ama en azından Intellisense, derlemelere ve sözdizimi vurgulama çalışmalarına atıfta bulunuyor.
Oktoat

Özel çıktı dizininiz bir üst dizini ala '.. \ some \ dir \' gösteriyorsa, orijinal sorunun ortaya çıktığını belirtmek gerekir . Ancak çıktı dizinini 'bir \ dir \' olarak değiştirirseniz, her şey yolunda gider. Bu kesinlikle matristeki şeytani bir aksaklıktır.
XDS

7

Görünüşe göre bu cevabı arıyorsunuz: https://stackoverflow.com/a/4136773/176877

Yani, içteki Views \ Web.Config dosyasını açın (kök olanı DEĞİL) ve Pages etiketinin altına ad alanını ekleyin:

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

Bunu kaydedin, ardından Razor dosyasını kapatıp yeniden açın.

Alanları kullanıyorsanız, her bir Bölgedeki her Web.Config için bunu yapmanız gerekir.

Visual Studio yıllar içinde daha fazla hata yaptı, bu nedenle bir Hata Ayıklama derlemesi çalıştıran Razor dosyasını kapatmayı ve ardından Razor dosyasını yeniden açmayı veya en kötü durumda Visual Studio'nun yeniden başlatılmasını gerektirebilir. Ancak nihayetinde Razor dosyasını, bu ad alanları listesindeki her şey tüm Görünümlerinizin en üstündeki @ kullanılıyor ifadelerindeymiş gibi sunacaktır.


4

In ASP.NET Çekirdek MVC çözümü eklemektir usingyerine ASP.NET MVC 5 ile çalışırken Görünümde klasöründe web.config koyma, _ViewImports.cshtml içinde.

_ViewImports.cshtml

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

Görünüm

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

3

Benim için konsol uygulaması olan bir projeye atıfta bulunuyordum. Sınıf kitaplığı (DLL) yerine bir exe (konsol uygulaması) oluşturacak şekilde ayarlandı. Bunu değiştirdiğimde, bu ayrı projedeki modelleri sorunsuz bir şekilde görebildim.


Teşekkürler @ user1619480, aynı sorunu yaşadım ve benim durumumda bir .Net Framework Sınıf Kitaplığı'ndan VS 2017 kullanarak ekledim ve bir nedenle Çıktı türü Konsol Uygulamasıydı.
danfer

1

Bir Razor görünümünde Smo nesnelerini kullanmaya çalışırken aynı hatayı alıyordum. Görünüşe göre bunun nedeni Razor'un projede başvurulan DLL'leri bulamamasıdır. Bunu, tüm Smo dll'leri için "Yerel Kopyala" yı doğru olarak ayarlayarak çözdüm, ancak daha iyi bir çözüm olabilir (yukarıdaki Czechdude bağlantısına bakın) @using ve web.config düzenlemeleri işe yaramaz çünkü bunlar yalnızca ad alanını çıkarmak isterseniz gereklidir tür adlarından bir bölüm (örneğin Microsoft.SqlServer.Management.Smo.Server yerine Sunucu)


1

Dev makinemi Win7 32bit'ten Win7 64bit'e taşıdıktan sonra benzer bir hata alıyordum. Hata mesajı:

...\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'de iki versiyonum da olduğu ortaya çıktı. Görünüm web.configv1'e başvurdu ancak uygulama v2'ye başvuruyordu. Başvurulan derlemeler kaldırıldı ve v1 yeniden eklendi. arasında System.Web.WebPages.Razor, vb


+1 thx bu benim son noktamdı, şimdi asp.net mvc 4 hohoho'da hata ayıklayabilirim!
citykid

1

benim için farklıydı. MVC projesi ile konsol uygulama projemin montajını kaçırdım. Yani referans eklemek yeterli değildi.

Peki bu başka birine yardımcı olabilir. kök web.config dosyasına gidin system.web-> compilation-> proje referansınızı bu şekilde ekleyin.

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


1

Bende de aynı sorun vardı, ancak sorun meclisin Hedef çerçevesi ile ilgiliydi .

Başvurulan derleme, projenin .NET framework 4.5 olarak ayarlandığı .NET Framework 4.6'da yapılmıştır.

Umarım bu, çerçevelerle uğraşan birine yardımcı olur.


1

Proje KLASÖR adınızın aynı olması gerekir. Proje veya Çözüm adınız farklıysa, MVC size zarar verir.

Örnek: Yeni bir Uygulama oluşturursanız ve Webapplicaiton1 varsayılan adını alırsa, bu ad alanı oluşturulur. Öyleyse, bu ad alanına sahip olmak istemediğinizi söyleyelim, bu nedenle VS'den görebildiğiniz her yeri "MyNamespace" olarak değiştirin. Ayrıca "Webapplication1" deki tüm kodu arar ve değiştirir ve "MyNamespace" ile değiştirirsiniz. Bu aynı zamanda web.config dosyasını değiştirir, böylece

Artık Razor görünümleri dışında her şey çalışacak.

RazorViews bulamıyor, çünkü projenin FOLDERNAME'ine bir tür garip bağımlılık var. Korkunç bir tasarım.

Dosyalarımı yeni bir çözüme kopyalayarak bunu yarı kapsamlı bir şekilde test ettim ve tek fark klasör adıydı.


Bu ne kadar saçma! Proje klasörü adını doğru olarak yeniden adlandırdım ve çözümü bir metin dosyasında açtım ve klasör açıklamasını düzelttim! İşe yaradı! Visual Studio 2019 kullanıyorum
Daniel

0

Bulunduğunuz ad alanını MyClassesaşağıdaki web.config dosyasına eklemeyi deneyin

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


0

tüm ad alanını dahil et

@model namespace.myclasses.mymodel

0

Bunların hiçbiri https://stackoverflow.com/a/7597360/808128 benim için çalışmıyor. Hatta "kök web.config dosyasının system.web / compilation / assemblies bölümüne assembly referecene eklenmesi" bile. Yani iki yol benim için kalıyor: 1) Razor kodunun bu derlemeye bu sarma yoluyla erişebileceği derlemem için bir genel sarma sınıfı eklemek; 2) Razor'un kodunun bulunduğu aynı derlemede bir ortak sınıfa derleme mantığı ekleyin.


0

İçin web.config değişiklik yapmadan ek olarak <assemblies>ve <namespaces>ben GAC'ing montaj büyük bir fark yarattığını ortaya koymuştur. Genel olarak kayıtlı herhangi bir çekirdek .NET derlemesi gibi kültür ve ortak anahtar belirteci uygulayabilirsiniz.

Bazıları GAC'den bahsedildiğinde titreyebilir. Ancak bir BizTalk geliştiricisi olarak onu benimsemeye başladım.


0

Bu çözüm benim için çalıştı (Komik ama işe yarıyor)

Görünüm sayfalarını düzenledim ve içeriğini kopyaladım ve içine yapıştırdım, görünümlerin herhangi bir içeriğini değiştirmedim, ancak görsel stüdyonun sayfaları izlemek için her şeyi yapabilmesi için düzenledim ve ardından her şey çalışmaya başladı

Çözüm - Sadece sayfaları düzenleyin ve aynı sayfalarla değiştirin (Benim için çalıştı)


0

boşluk adı modellerinde yourClassModel, name sınıfından önce public ekleyin

public class yourClassModel{
    prop
}

0

Benim durumumda, jilet sınıf kitaplığı projem 2.0 olarak ayarlanmışken, kullanmaya çalıştığım paket .net 2.1'e başvuruyordu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.