Tampilan berbasis pisau cukur tidak melihat rakitan yang direferensikan

101

Saya mencoba untuk membuat tampilan yang sangat diketik berdasarkan kelas dari rakitan lain. Untuk alasan apa pun, tampilan Razor saya tampaknya tidak memiliki visibilitas rakitan lain yang dirujuk pada proyek saya. misalnya

@model MyClasses.MyModel

menghasilkan kesalahan dalam Visual Studio 2010, "Jenis atau nama namespace MyClassestidak dapat ditemukan (apakah Anda kehilangan petunjuk penggunaan atau rakitan referensi?)."

Kelas yang sama yang direferensikan dalam mesin tampilan standar berfungsi dengan baik. Saya mengalami masalah yang sama saat mencoba merujuk kelas dalam tubuh pandangan saya.

Apakah saya melewatkan sesuatu tentang Razor atau apakah saya perlu merujuk perakitan dengan cara lain?

Nickwesselman
sumber
Apakah Anda menggunakan seluruh namespace? @model namespace.myclasses.mymodel, mungkin?
Brettski

Jawaban:

107

Ada bagian konfigurasi baru yang digunakan untuk mereferensikan ruang nama untuk tampilan Razor.

Buka web.configfile di Viewsfolder Anda , dan pastikan file tersebut memiliki yang berikut:

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

Alternatifnya, Anda dapat menambahkan menggunakan pernyataan ke tata letak bersama Anda:

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

Setelah mengedit Web.config, mulai ulang Visual Studio untuk menerapkan perubahan.

quentin-starin
sumber
18
Ini berfungsi, namun pastikan rakitan Anda direferensikan Copy Local = true. Rakitan eksternal mungkin tidak berfungsi sebaliknya.
Terry
1
Perlu dicatat di sini bahwa jika Anda menggunakan tampilan dari sumber "virtual" (seperti DB) daripada menggunakan file tampilan nyata, Anda harus meletakkan ini di file ROOT web.config agar kode dalam tampilan berfungsi.
NightOwl888
2
@ Terry, tampaknya Salin local = true diperlukan bahkan untuk beberapa rakitan namespace root Sistem.
Dan Esparza
2
Majelis saya dimuat saat runtime, jadi saya tidak dapat menggunakan file web.config untuk menambahkannya. Apakah ada hal lain yang bisa saya coba? Apakah ada cara untuk mengimpor tampilan eksternal saya dengan file web.config mereka sendiri? Agak aneh karena saya mereferensikan namespace dalam kumpulan yang sama dengan pandangan saya.
Maksim Vi.
Memulai ulang Visual Studio tidak diperlukan. Cukup menutup dan membuka kembali Views sudah cukup.
pengguna247702
58

Saya memiliki masalah yang sama: MVC3 Project MyCore.Web merujuk ke namespace MyCore.DBLayer dari proyek lain dalam solusi yang sama (dengan nama assembly MyCoreDBLayer). Semua objek dari MyCore.DBLayer bekerja dengan sempurna di Pengontrol dan Model tetapi gagal di tampilan Razor dengan kesalahan 'Jenis atau nama namespace' DBLayer 'tidak ada di namespace' MyCore '(apakah Anda kehilangan referensi perakitan?)' Yang sebelumnya jelas tidak demikian.

  • Opsi Salin Lokal disetel ke true.
  • Menambahkan pernyataan "menggunakan ..." dalam tampilan Razor tidak berguna
  • Menambahkan ruang nama ke bagian system.webPages.razor juga tidak berguna

Menambahkan referensi assembly ke bagian system.web / kompilasi / assemblies dari file web.config root memperbaiki masalah. Bagian tersebut sekarang terlihat seperti:

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

Menghilangkan versi, budaya, token baik-baik saja untuk saat ini, tetapi harus diperbaiki di masa mendatang.

VB
sumber
Solusi ini berhasil tetapi itu ide yang buruk. Ketika saya menjadikan semua kelas saya internal dan menjadikan perakitan Web sebagai teman bagi MyCoreDBLayer, itu berhenti bekerja. Saya akhirnya menulis kelas publik sebagai model MVC yang membungkus kelas saya dari majelis teman. Saya percaya seseorang tidak boleh menggunakan kelas lain yang dari namespace model MVC dalam pandangan Razor - selalu mungkin untuk menulis pembungkus
VB
Ini berhasil untuk saya, saya mencoba menambahkannya ke Views/web.configdan berhasil ketika ditempatkan di sana juga.
guanome
18

Dalam kasus saya, proyek terpisah yang berisi namespace adalah Aplikasi Konsol. Mengubahnya ke Perpustakaan Kelas memperbaiki masalah.

Sam
sumber
1
Ini menyelesaikannya untuk saya. Pertama saya mencoba membuat Perpustakaan Kelas (Paket), tetapi mengalami masalah yang merujuk pada paket nuget yang saya butuhkan. Lebih baik tidak menjadi mewah dan hanya membuat Perpustakaan Kelas dasar (DLL)
redwards510
15

Tak satu pun di atas berhasil untuk saya;

  • Dlls disetel ke Salin Lokal
  • Menambahkan ruang nama ke kedua web.configs tidak melakukan apa-apa
  • Menambahkan referensi assembly ke system.web \ compilation \ assemblies juga tidak membantu (walaupun saya belum menghapus referensi ini, jadi mungkin referensi tersebut juga diperlukan)

Tetapi saya akhirnya menemukan sesuatu yang berhasil untuk saya:

Itu karena saya memiliki Build Output saya menuju bin \ Debug \ untuk konfigurasi Debug dan bin \ Release \ untuk konfigurasi Rilis. Segera setelah saya mengubah Konfigurasi Build menjadi "bin \" untuk Semua konfigurasi (seperti gambar di bawah) maka semuanya mulai bekerja sebagaimana mestinya !!!

Bangun Konfigurasi

Saya tidak tahu mengapa memisahkan build Anda ke dalam folder Release dan Debug harus menyebabkan sintaks Razor rusak, tetapi tampaknya itu karena sesuatu tidak dapat menemukan rakitan. Bagi saya, proyek yang mengalami masalah sintaksis pisau cukur sebenarnya adalah proyek 'perpustakaan pisau cukur' saya. Mereka ditetapkan sebagai Proyek Aplikasi namun saya menggunakannya sebagai perpustakaan kelas dengan RazorGenerator untuk mengkompilasi pandangan saya. Ketika saya benar-benar mencoba menjalankan salah satu proyek ini secara langsung, itu menyebabkan kesalahan Konfigurasi berikut:

Tidak dapat memuat file atau rakitan 'System.Web.Helpers, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' atau salah satu dependensinya. Sistem tidak dapat menemukan berkas yang dicari.

Hal ini mengarahkan saya untuk mencoba mengubah Output Build, karena saya perhatikan bahwa untuk semua proyek web, Output Build tampaknya selalu langsung ke folder bin, tidak seperti default untuk perpustakaan kelas, yang memiliki folder rilis dan debug.

Sylvia
sumber
1
Telah dikonfirmasi dengan cara bahwa Anda tidak perlu memiliki bagian system.web \ compilation \ assemblies begitu dll langsung berada di folder bin. Ini bisa kembali menjadi <compilation debug = "true" targetFramework = "4.5.1" />
Sylvia
2
Astaga! Setelah banyak waktu mencari solusi, ini akhirnya memecahkan pandangan Razor saya dalam proyek perpustakaan kelas !! Terima kasih banyak.
Hullah
2
Luar biasa! Saya sedang membangun perpustakaan kelas pandangan saya ke dalam direktori proyek lain dan mengalami masalah ini. Jalur build harus bin \ agar ini berfungsi. Sekarang gunakan post build xcopy sebagai gantinya.
GlacialSpoon
1
Saya menggunakan Razor Engine dalam proyek perpustakaan kelas dan menghadapi masalah yang sama. Mengatur jalur keluaran ke "bin \" memecahkan masalah ini untuk saya juga. Seperti GlacialSpoon saya menyalin perakitan dalam langkah pasca-pembuatan ke folder keluaran yang benar. Bukan cara terbaik, tapi setidaknya, Intellisense, rakitan referensi, dan penyorotan sintaks berfungsi.
Oktoat
Perlu dicatat bahwa masalah asli muncul jika direktori keluaran kustom Anda mengarah ke direktori induk ala '.. \ some \ dir \'. Tetapi jika Anda mengubah direktori output menjadi 'some \ dir \' maka semuanya berfungsi dengan baik. Ini pasti kesalahan jahat dalam matriks.
XDS
7

Anda sepertinya mencari jawaban ini: https://stackoverflow.com/a/4136773/176877

Artinya, buka dalam Views \ Web.Config (BUKAN root), dan tambahkan namespace di bawah tag Halaman:

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

Simpan itu, lalu tutup dan buka kembali file Razor.

Jika Anda menggunakan Area, Anda harus melakukan ini untuk setiap Web.Config di setiap Area.

Visual Studio telah menjadi buggier selama bertahun-tahun sehingga mungkin memerlukan penutupan berkas Razor yang menjalankan pembuatan Debug kemudian membuka kembali berkas Razor, atau mungkin yang terburuk memerlukan restart Visual Studio. Tetapi pada akhirnya ini akan menampilkan file Razor kepada Anda seolah-olah semua yang ada di daftar namespaces itu ada di pernyataan @using di bagian atas semua Tampilan Anda.

Chris Moschini
sumber
4

Dalam ASP.NET Core MVC , solusinya adalah menambahkan usingdi _ViewImports.cshtml, alih-alih meletakkannya di web.config di folder View saat bekerja dengan 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

Melihat

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

Bagi saya, saya mereferensikan proyek yang merupakan aplikasi konsol. Itu ditetapkan untuk membangun sebagai exe (aplikasi konsol) dan bukan perpustakaan kelas (DLL). Ketika saya mengubah ini, saya dapat melihat model dari proyek terpisah itu tidak ada masalah.

pengguna1619480
sumber
Terima kasih @ user1619480, saya memiliki masalah yang sama dan dalam kasus saya dari .Net Framework Class Library yang saya tambahkan menggunakan VS 2017 dan untuk beberapa alasan jenis Output adalah Aplikasi Konsol.
danfer
1

Saya mendapatkan kesalahan yang sama saat mencoba menggunakan objek Smo dalam tampilan Razor. Tampaknya ini karena Razor tidak dapat menemukan DLL yang dirujuk dalam proyek tersebut. Saya menyelesaikan ini dengan mengatur "Salin Lokal" ke true untuk semua dll Smo, namun mungkin ada solusi yang lebih baik (lihat tautan Czechdude di atas) @using dan web.config suntingan tidak berguna karena mereka hanya diperlukan jika Anda ingin menghilangkan namespace bagian dari nama jenis (misalnya Server, bukan Microsoft.SqlServer.Management.Smo.Server)

Zar Shardan
sumber
1

Saya mendapatkan kesalahan serupa setelah memindahkan mesin dev saya dari Win7 32bit ke Win7 64bit. Pesan eror:

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

Ternyata saya memiliki kedua versi di GAC. View web.configmereferensikan v1 tetapi aplikasi mereferensikan v2. Menghapus majelis yang direferensikan dan menambahkan kembali v1. dariSystem.Web.WebPages.Razor , dll.

Tim
sumber
+1 thx ini adalah poin terakhir saya, sekarang saya dapat men-debug asp.net mvc 4 hohoho!
citykid
1

baik, bagi saya itu berbeda. Saya melewatkan perakitan proyek aplikasi konsol saya dengan proyek MVC. Jadi, menambah referensi saja tidak cukup.

nah ini mungkin bisa membantu orang lain. pergi ke root file web.config system.web-> compilation-> tambahkan referensi proyek Anda seperti ini.

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

Jawand Singh
sumber
1

Saya juga memiliki masalah yang sama, tetapi masalahnya ada pada kerangka Target perakitan .

Rakitan yang direferensikan berada di .NET Framework 4.6 di mana proyek telah diatur ke .NET framework 4.5.

Semoga ini akan membantu seseorang yang mengacaukan kerangka kerja.

Geeganage
sumber
1

Nama Project FOLDER Anda harus sama. Jika nama Proyek atau Solusi Anda berbeda, MVC akan merugikan Anda.

Contoh: Jika Anda membuat Aplikasi baru dan mendapat nama default Webapplicaiton1, namespace ini akan dibuat. Jadi, katakanlah Anda tidak ingin memiliki namespace ini, jadi dari VS Anda mengubah di mana pun Anda dapat melihat "MyNamespace". Anda juga mencari dan mengganti semua kode dari "Webapplication1" dan menggantinya dengan "MyNamespace". Ini juga mengubah file web.config, sehingga menjadi

Sekarang semuanya akan bekerja, kecuali tampilan Razor.

RazorViews tidak dapat menemukannya, karena ada semacam ketergantungan yang aneh pada FOLDERNAME proyek. Ini desain yang buruk.

Saya telah menguji ini semi-menyeluruh dengan menyalin file saya ke solusi baru, dan satu-satunya perbedaan adalah nama folder.

Jens Tand
sumber
Luar biasa betapa konyolnya ini! Saya telah mengganti nama nama folder proyek, ke yang benar, dan membuka solusi dalam file teks dan memperbaiki deskripsi folder! Berhasil! Saya menggunakan studio visual 2019
Daniel
0

Coba tambahkan namespace Anda MyClasseske web.config di bawah

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

amurra
sumber
0

sertakan seluruh namespace

@model namespace.myclasses.mymodel
Brettski
sumber
0

Tidak satu pun dari https://stackoverflow.com/a/7597360/808128 ini yang berfungsi untuk saya. Bahkan "menambahkan referensi assembly ke bagian system.web / kompilasi / assemblies dari file web.config root". Jadi dua cara tetap bagi saya: 1) untuk menambahkan kelas bungkus publik untuk assembly saya yang dapat diakses kode Razor ke assembly ini melalui bungkus ini; 2) cukup tambahkan logika rakitan ke kelas publik di rakitan yang sama tempat kode Razor berada.

pengguna808128
sumber
0

Selain membuat perubahan web.config untuk <assemblies>dan<namespaces> , saya menemukan bahwa GAC ​​membuat perbedaan besar. Anda dapat menerapkan budaya dan token kunci publik seperti rakitan inti .NET apa pun yang terdaftar secara global.

Beberapa orang mungkin merasa ngeri saat menyebut GAC. Tetapi sebagai pengembang BizTalk, saya telah berkembang untuk menerimanya.

Tanda
sumber
0

Solusi ini berhasil untuk saya (Lucu, tapi berhasil)

Saya mengedit halaman tampilan dan menyalin isinya dan menempelkannya, saya tidak mengubah konten tampilan apa pun, tetapi hanya mengedit sehingga studio visual dapat melakukan hal itu untuk melacak halaman, dan setelah itu semuanya mulai berfungsi

Solusi - Cukup edit halaman dan ganti dengan halaman yang sama (Bekerja untuk saya)

Arun Prasad ES
sumber
0

dalam model spacename, yourClassModel, tambahkan public sebelum name class

public class yourClassModel{
    prop
}
Milad Jafari
sumber
0

Dalam kasus saya, paket yang saya coba gunakan merujuk ke .net standard 2.1 sementara proyek perpustakaan kelas pisau cukur saya disetel ke 2.0

Denis Reichelt
sumber