มุมมองที่ใช้มีดโกนไม่เห็นชุดประกอบที่อ้างอิง


101

ฉันกำลังพยายามสร้างมุมมองที่พิมพ์ผิดโดยอิงจากคลาสจากแอสเซมบลีอื่น ไม่ว่าจะด้วยเหตุผลใดก็ตามมุมมอง Razor ของฉันดูเหมือนจะไม่สามารถมองเห็นส่วนประกอบอื่น ๆ ที่อ้างถึงในโครงการของฉันได้ เช่น

@model MyClasses.MyModel

ผลลัพธ์ในข้อผิดพลาดใน Visual Studio 2010 "ไม่พบชนิดหรือชื่อเนมสเปซMyClasses(คุณไม่มีคำสั่งโดยใช้หรือการอ้างอิงแอสเซมบลีหรือไม่)"

คลาสเดียวกันที่อ้างถึงในเอ็นจินมุมมองมาตรฐานทำงานได้ดี ฉันมีปัญหาเหมือนกันในการพยายามอ้างอิงชั้นเรียนในเนื้อหาของมุมมองของฉัน

ฉันพลาดบางอย่างเกี่ยวกับ Razor หรือฉันจำเป็นต้องอ้างอิงการประกอบด้วยวิธีอื่นหรือไม่?


คุณใช้เนมสเปซทั้งหมดหรือไม่ @ รุ่น namespace.myclasses.mymodel บางที?
Brettski

คำตอบ:


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แต่ให้แน่ใจว่าคุณประกอบกับมีการอ้างอิง การประกอบภายนอกอาจใช้งานไม่ได้
Terry

1
ควรสังเกตที่นี่ว่าหากคุณใช้มุมมองจากแหล่งที่มา "เสมือน" (เช่น DB) แทนที่จะใช้ไฟล์มุมมองจริงคุณต้องใส่สิ่งนี้ในไฟล์ ROOT web.config เพื่อให้โค้ดในมุมมองทำงาน
NightOwl888

2
@Terry ดูเหมือนว่า Copy local = true เป็นสิ่งที่จำเป็นแม้กระทั่งสำหรับส่วนประกอบของ System root namespaced
Dan Esparza

2
แอสเซมบลีของฉันถูกโหลดที่รันไทม์ดังนั้นฉันจึงไม่สามารถใช้ไฟล์ web.config เพื่อเพิ่มได้ มีอะไรให้ลองทำอีกไหม? มีวิธีนำเข้ามุมมองภายนอกของฉันด้วยไฟล์ web.config ของตัวเองหรือไม่ ค่อนข้างแปลกเพราะฉันอ้างถึงเนมสเปซภายในแอสเซมบลีเดียวกับมุมมองของฉัน
Vi.

ไม่จำเป็นต้องรีสตาร์ท Visual Studio เพียงแค่ปิดและเปิดมุมมองใหม่ก็เพียงพอแล้ว
user247702

58

ฉันมีปัญหาเดียวกัน: MVC3 Project MyCore เว็บกำลังอ้างถึง MyCore DBLayer namespace จากโปรเจ็กต์อื่นในโซลูชันเดียวกัน (พร้อมชื่อแอสเซมบลี MyCoreDBLayer) วัตถุทั้งหมดจาก MyCore DBLayer ทำงานได้อย่างสมบูรณ์ในตัวควบคุมและโมเดล แต่ล้มเหลวในมุมมอง Razor โดยมีข้อผิดพลาด'ประเภทหรือชื่อเนมสเปซ' DBLayer 'ไม่มีอยู่ในเนมสเปซ' MyCore '(คุณไม่มีการอ้างอิงการประกอบหรือไม่)'ซึ่งเป็น เห็นได้ชัดว่าไม่ใช่กรณี

  • ตัวเลือก Copy Local ถูกตั้งค่าเป็น true
  • การเพิ่มคำสั่ง "ใช้ ... " ในมุมมองของ Razor นั้นไม่มีประโยชน์
  • การเพิ่มเนมสเปซในส่วน system.web.webPages.razor ก็ไร้ประโยชน์เช่นกัน

การเพิ่มการอ้างอิงแอสเซมบลีในส่วน system.web / compilation / assemblies ของไฟล์ root 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>

การละเว้นเวอร์ชันวัฒนธรรมโทเค็นนั้นใช้ได้ในตอนนี้ แต่ควรได้รับการแก้ไขในอนาคต


วิธีนี้ใช้ได้ผล แต่เป็นความคิดที่ไม่ดี เมื่อฉันทำให้ชั้นเรียนทั้งหมดเป็นแบบภายในและทำให้ Web Assembly เป็นเพื่อนกับ MyCoreDBLayer มันก็หยุดทำงาน ฉันลงเอยด้วยการเขียนชั้นเรียนสาธารณะในรูปแบบ MVC ที่ล้อมรอบชั้นเรียนของฉันจากกลุ่มเพื่อน ฉันเชื่อว่าเราไม่ควรใช้คลาสอื่นที่มาจากเนมสเปซโมเดลของ MVC ในมุมมอง Razor - มันเป็นไปได้เสมอที่จะเขียน wrapper
VB

สิ่งนี้ใช้ได้ผลสำหรับฉันฉันลองเพิ่มเข้าไปViews/web.configและมันก็ใช้ได้ผลเมื่อวางไว้ที่นั่นด้วย
guanome

18

ในกรณีของฉันโปรเจ็กต์แยกต่างหากที่มีเนมสเปซคือแอปพลิเคชันคอนโซล การเปลี่ยนเป็นไลบรารีคลาสช่วยแก้ปัญหาได้


1
สิ่งนี้แก้ไขได้สำหรับฉัน ก่อนอื่นฉันลองสร้าง Class Library (Package) แต่พบปัญหาในการอ้างถึงแพ็คเกจ nuget ที่ฉันต้องการ ดีที่สุดอย่า
มัว

15

ไม่มีข้อใดที่ใช้ได้ผลสำหรับฉันเช่นกัน

  • Dlls ถูกตั้งค่าเป็น Copy Local
  • การเพิ่มเนมสเปซให้กับ web.configs ทั้งสองไม่ได้ทำอะไรเลย
  • การเพิ่มการอ้างอิงแอสเซมบลีใน system.web \ compilation \ assemblies ก็ไม่ได้ช่วยอะไร (แม้ว่าฉันจะไม่ได้ลบการอ้างอิงเหล่านี้ออกไปดังนั้นอาจจำเป็นด้วย)

แต่ในที่สุดฉันก็พบสิ่งที่เหมาะกับฉัน:

เป็นเพราะฉันมี Build Output ไปที่ bin \ Debug \ สำหรับการกำหนดค่าการดีบักและ bin \ Release \ สำหรับการกำหนดค่ารุ่น ทันทีที่ฉันเปลี่ยน Build Configuation เป็น "bin \" สำหรับการกำหนดค่าทั้งหมด (ตามภาพด้านล่าง) ทุกอย่างก็เริ่มทำงานตามที่ควร !!!

สร้างการกำหนดค่า

ฉันไม่รู้ว่าทำไมการแยกงานสร้างของคุณออกเป็นโฟลเดอร์ Release และ Debug จึงควรทำให้ไวยากรณ์ของ Razor พัง แต่ดูเหมือนว่าจะเป็นเพราะมีบางอย่างไม่พบแอสเซมบลี สำหรับฉันโครงการที่มีปัญหาเกี่ยวกับไวยากรณ์ของมีดโกนเป็นโครงการ 'คลังใบมีดโกน' ของฉัน พวกเขาถูกตั้งค่าเป็น Application Projects แต่ฉันใช้เป็นไลบรารีคลาสด้วย RazorGenerator เพื่อรวบรวมมุมมองของฉัน เมื่อฉันพยายามเรียกใช้โครงการเหล่านี้โดยตรงมันทำให้เกิดข้อผิดพลาดในการกำหนดค่าต่อไปนี้:

ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'System.Web.Helpers, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' หรือหนึ่งในการอ้างอิง ระบบไม่พบแฟ้มที่ระบุ.

สิ่งนี้ทำให้ฉันพยายามเปลี่ยน Build Output เนื่องจากฉันสังเกตเห็นว่าสำหรับโปรเจ็กต์เว็บทั้งหมด Build Output ดูเหมือนจะตรงไปที่โฟลเดอร์ bin เสมอซึ่งแตกต่างจากค่าเริ่มต้นสำหรับไลบรารีคลาสซึ่งมีทั้งโฟลเดอร์รีลีสและดีบัก


1
ได้รับการยืนยันโดยวิธีที่คุณไม่จำเป็นต้องมีส่วน system.web \ compilation \ assemblies เมื่อ dlls อยู่ในโฟลเดอร์ bin โดยตรง สิ่งนี้สามารถย้อนกลับไปเป็นเพียง <compilation debug = "true" targetFramework = "4.5.1" />
Sylvia

2
วัวศักดิ์สิทธิ์! หลังจากค้นหาวิธีแก้ปัญหาอยู่นานในที่สุดสิ่งนี้ก็แก้ไขมุมมอง Razor ของฉันในโปรเจ็กต์ไลบรารีคลาส !! ขอบคุณมาก.
Hullah

2
เหลือเชื่อ! ฉันกำลังสร้างไลบรารีคลาสของมุมมองในไดเร็กทอรีของโปรเจ็กต์อื่นและมีปัญหานี้ เส้นทางการสร้างต้องเป็น bin \ เพื่อให้สิ่งนี้ทำงานได้ ตอนนี้ใช้ post build xcopy แทน
GlacialSpoon

1
ฉันใช้ Razor Engine ในโปรเจ็กต์ไลบรารีคลาสและประสบปัญหาเดียวกัน การตั้งค่าเส้นทางเอาต์พุตเป็น "bin \" ช่วยแก้ปัญหานี้ให้ฉันได้เช่นกัน เช่นเดียวกับ GlacialSpoon ฉันคัดลอกแอสเซมบลีในขั้นตอนหลังการสร้างไปยังโฟลเดอร์ผลลัพธ์ที่ถูกต้อง ไม่ใช่วิธีที่ดีที่สุด แต่อย่างน้อย Intellisense การอ้างอิงแอสเซมบลีและการเน้นไวยากรณ์
59

เป็นที่น่าสังเกตว่าปัญหาเดิมจะเกิดขึ้นหากไดเร็กทอรีเอาต์พุตที่กำหนดเองของคุณชี้ไปที่ไดเร็กทอรีหลัก ala '.. \ some \ dir \' แต่ถ้าคุณเปลี่ยนไดเรกทอรีผลลัพธ์เป็น 'some \ dir \' แสดงว่าทุกอย่างทำงานได้ดี นี่เป็นความผิดพลาดร้ายแรงในเมทริกซ์อย่างแน่นอน
XDS

7

ดูเหมือนว่าคุณกำลังมองหาคำตอบนี้: https://stackoverflow.com/a/4136773/176877

นั่นคือเปิด Views \ Web.Config ภายใน (ไม่ใช่รูทหนึ่ง) และเพิ่มเนมสเปซภายใต้แท็กเพจ:

<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 ที่เรียกใช้รุ่น Debug จากนั้นเปิดไฟล์ Razor อีกครั้งหรือในกรณีที่เลวร้ายที่สุดต้องรีสตาร์ท Visual Studio แต่ท้ายที่สุดแล้วมันจะนำเสนอไฟล์ Razor ให้กับคุณราวกับว่าทุกอย่างในรายการเนมสเปซนั้นอยู่ในคำสั่ง @ ที่ด้านบนสุดของมุมมองทั้งหมดของคุณ


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 ฉันเพิ่มโดยใช้ VS 2017 และด้วยเหตุผลบางประการประเภทเอาต์พุตคือแอปพลิเคชันคอนโซล
danfer

1

ฉันได้รับข้อผิดพลาดเดียวกันขณะพยายามใช้วัตถุ Smo ในมุมมองมีดโกน เห็นได้ชัดว่าเป็นเพราะ Razor ไม่พบ DLL ที่อ้างถึงในโครงการ ฉันแก้ไขปัญหานี้ได้โดยการตั้งค่า "Copy Local" เป็น true สำหรับ Smo dll ทั้งหมดอย่างไรก็ตามอาจมีวิธีแก้ปัญหาที่ดีกว่า (ดูลิงก์ของ Czechdude ด้านบน) การแก้ไข @using และ web.config นั้นไม่มีประโยชน์เพราะจำเป็นเฉพาะเมื่อคุณต้องการละเนมสเปซ ส่วนหนึ่งจากชื่อประเภท (เช่นเซิร์ฟเวอร์อินสแตนซ์แทน Microsoft.SqlServer.Management.Smo.Server)


1

ฉันได้รับข้อผิดพลาดที่คล้ายกันหลังจากย้ายเครื่อง 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ฯลฯ


+1 ขอบคุณนี่คือจุดสุดท้ายของฉันตอนนี้ฉันสามารถ debug asp.net mvc 4 hohoho!
citykid

1

สำหรับฉันมันต่างออกไป ฉันขาดการประกอบโครงการแอปพลิเคชันคอนโซลกับโครงการ MVC ดังนั้นการเพิ่มข้อมูลอ้างอิงจึงไม่เพียงพอ

สิ่งนี้อาจช่วยคนอื่นได้ ไปที่ไฟล์ root 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 จะทำร้ายคุณ

ตัวอย่าง: หากคุณสร้าง Application ใหม่และได้รับชื่อเริ่มต้น Webapplicaiton1 ระบบจะสร้างเนมสเปซนี้ ดังนั้นให้เราบอกว่าคุณไม่ต้องการมีเนมสเปซนี้ดังนั้นจาก VS คุณจะเปลี่ยนทุกที่ที่คุณเห็นเป็น "MyNamespace" คุณยังค้นหาและแทนที่โค้ดทั้งหมดจาก "Webapplication1" และแทนที่ด้วย "MyNamespace" นอกจากนี้ยังเปลี่ยนไฟล์ web.config เพื่อให้รวมเข้าด้วยกัน

ตอนนี้ทุกอย่างจะทำงานยกเว้นมุมมอง Razor

RazorViews ไม่พบเนื่องจากมีการพึ่งพา FOLDERNAME ของโปรเจ็กต์แปลก ๆ เป็นการออกแบบที่แย่มาก

ฉันได้ทดสอบสิ่งนี้แบบกึ่งละเอียดโดยการคัดลอกไฟล์ของฉันไปยังโซลูชันใหม่และความแตกต่างเพียงอย่างเดียวคือชื่อพับ


เหลือเชื่อขนาดนี้! ฉันได้เปลี่ยนชื่อโฟลเดอร์โปรเจ็กต์เป็นชื่อที่ถูกต้องและเปิดโซลูชันในไฟล์ข้อความและแก้ไขคำอธิบายโฟลเดอร์! มันได้ผล! ฉันกำลังใช้ Visual Studio 2019
Daniel



0

https://stackoverflow.com/a/7597360/808128เหล่านี้ไม่ได้ผลสำหรับฉัน แม้แต่ "การเพิ่มการอ้างอิงแอสเซมบลีในส่วน system.web / compilation / assemblies ของไฟล์ root web.config" ดังนั้นสองวิธีนี้ยังคงอยู่สำหรับฉัน: 1) เพิ่มคลาสการห่อสาธารณะสำหรับแอสเซมบลีของฉันที่รหัส Razor สามารถเข้าถึงแอสเซมบลีนี้ผ่านการห่อนี้ 2) เพียงเพิ่มลอจิกแอสเซมบลีให้กับคลาสสาธารณะในแอสเซมบลีเดียวกับที่โค้ดของมีดโกนตั้งอยู่


0

นอกเหนือจากการเปลี่ยนแปลง web.config <assemblies>และ<namespaces>ฉันพบว่าการประกอบ GAC สร้างความแตกต่างอย่างมาก คุณสามารถใช้วัฒนธรรมและโทเค็นคีย์สาธารณะเช่นแอสเซมบลี. NET หลักใด ๆ ที่ลงทะเบียนทั่วโลก

บางคนอาจสั่นเมื่อพูดถึง GAC แต่ในฐานะนักพัฒนา BizTalk ฉันเติบโตขึ้นเพื่อยอมรับมัน


0

วิธีนี้ใช้ได้ผลสำหรับฉัน (มันตลก แต่ใช้งานได้)

ฉันแก้ไขหน้ามุมมองและคัดลอกเนื้อหาและวางลงในนั้นฉันไม่ได้เปลี่ยนเนื้อหาใด ๆ ของมุมมอง แต่เพียงแก้ไขเพื่อให้วิชวลสตูดิโอทำสิ่งต่างๆในการติดตามเพจและหลังจากนั้นทุกอย่างก็เริ่มทำงาน

วิธีแก้ไข - เพียงแก้ไขหน้าและแทนที่ด้วยหน้าเดียวกัน (ทำงานให้ฉัน)



0

ในกรณีของฉันแพ็คเกจที่ฉันพยายามใช้นั้นอ้างถึง. net standard 2.1 ในขณะที่โครงการไลบรารีคลาสมีดโกนของฉันถูกตั้งค่าเป็น 2.0

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.