रेजर-आधारित दृश्य संदर्भित विधानसभाओं को नहीं देखता है


101

मैं एक अन्य विधानसभा से एक वर्ग के आधार पर एक जोरदार-टाइप दृश्य बनाने का प्रयास कर रहा हूं। जो भी कारण के लिए, हालांकि, मेरे रेजर दृश्य को मेरी परियोजना पर संदर्भित अन्य विधानसभाओं की कोई दृश्यता नहीं है। जैसे

@model MyClasses.MyModel

दृश्य स्टूडियो 2010 में त्रुटि के परिणाम, "प्रकार या नाम स्थान का नाम MyClassesनहीं मिल सका (क्या आप एक निर्देश या विधानसभा संदर्भ का उपयोग कर याद कर रहे हैं?)।"

मानक दृश्य इंजन में संदर्भित वही वर्ग ठीक काम करता है। मुझे अपने दृश्य के शरीर में कक्षा को संदर्भित करने की कोशिश करने में एक ही परेशानी है।

क्या मुझे रेजर के बारे में कुछ याद आ रहा है या क्या मुझे विधानसभा को किसी अन्य तरीके से संदर्भित करने की आवश्यकता है?


क्या आप पूरे नामस्थान का उपयोग कर रहे हैं? @model नेमस्पेस।
ब्रेत्स्की

जवाबों:


107

एक नया कॉन्फ़िगरेशन अनुभाग है जो रेजर दृश्यों के लिए नामस्थान को संदर्भित करने के लिए उपयोग किया जाता है।

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 फ़ाइल में रखना होगा।
नाइटऑवल

2
@ टेरी, ऐसा प्रतीत होता है कि कुछ सिस्टम रूट नामांकित असेंबली के लिए भी कॉपी लोकल = ट्रू जरूरी है।
दान एस्परजा

2
मेरी असेंबली रनटाइम पर भरी हुई हैं, इसलिए मैं उन्हें जोड़ने के लिए web.config फ़ाइल का उपयोग नहीं कर सकता। क्या यहां कुछ और है जिसके लिए मैं कोशिश कर सकता हूं? वहाँ अपने खुद के web.config फ़ाइलों के साथ मेरे बाहरी विचारों को आयात करने का एक तरीका है? यह अजीब है क्योंकि मैं अपने विचारों के अनुसार एक ही विधानसभा में नामस्थान का संदर्भ दे रहा हूं।
मक्सीम वी।

Visual Studio को पुनरारंभ करने की आवश्यकता नहीं है। बस बंद करना और दृश्य को फिर से खोलना काफी है।
user247702 14

58

मुझे एक ही समस्या थी: MVC3 प्रोजेक्ट MyCore.Web एक ही समाधान में एक अन्य परियोजना से MyCore.DBLayer नाम स्थान का संदर्भ दे रहा था (विधानसभा नाम MyCoreDBLayer के साथ)। MyCore.DBLayer की सभी वस्तुओं ने कंट्रोलर्स और मॉडल्स में पूरी तरह से काम किया लेकिन रेजर के विचारों में एक त्रुटि '' DBLayer 'टाइप या नाम स्थान के साथ असफल रहा ' नाम MyCore '(क्या आप एक असेंबली रेफरेंस को याद नहीं कर रहे हैं?) जो था ? जाहिर है मामला नहीं।

  • प्रतिलिपि स्थानीय विकल्प को सत्य पर सेट किया गया था।
  • रेजर के विचारों में "उपयोग ..." बयान जोड़ना बेकार था
  • System.web.webPages.razor सेक्शन में नामस्थान जोड़ना बेकार भी था

मूल web.config फ़ाइल में system.web / संकलन / असेंबली अनुभाग में असेंबली रेफ़रेन्स जोड़ना इस मुद्दे को निर्धारित करता है। अब अनुभाग ऐसा दिखता है:

<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 का मित्र बनाया, तो इसने काम करना बंद कर दिया। मैंने एमवीसी मॉडल के रूप में एक सार्वजनिक कक्षाओं को लिखना समाप्त कर दिया है जो मित्र विधानसभाओं से मेरी कक्षाओं के चारों ओर लपेटते हैं। मेरा मानना ​​है कि किसी को रेजर विचारों में एमवीसी के मॉडल नेमस्पेस से अन्य वर्गों का उपयोग नहीं करना चाहिए - एक आवरण लिखना हमेशा संभव होता है
वीबी

यह मेरे लिए काम करता है, मैंने इसे जोड़ने की कोशिश की Views/web.configऔर यह तब काम किया जब इसे वहां भी रखा गया था।
१६:०६ पर गनोम

18

मेरे मामले में, अलग प्रोजेक्ट जिसमें नेमस्पेस शामिल था, एक कंसोल एप्लीकेशन था। इसे क्लास लाइब्रेरी में बदलने से समस्या ठीक हो गई।


1
इससे मेरे लिए हल हो गया। पहले मैंने क्लास लाइब्रेरी (पैकेज) बनाने की कोशिश की, लेकिन एक नौगट पैकेज को संदर्भित करने वाली समस्याओं में भाग लिया, जिनकी मुझे ज़रूरत थी। बेस्ट को
फैंस

15

उपरोक्त में से कोई भी मेरे लिए काम नहीं किया;

  • स्थानीय को कॉपी करने के लिए Dll निर्धारित किए गए थे
  • दोनों web.configs में नामस्थान जोड़ने से कुछ नहीं हुआ
  • विधानसभा संदर्भों को system.web \ संकलन \ असेंबली में जोड़ने से भी मदद नहीं मिली (हालाँकि मैंने ये संदर्भ नहीं निकाले हैं, इसलिए यह हो सकता है कि उनकी भी आवश्यकता हो)

लेकिन मुझे आखिरकार कुछ ऐसा मिला जिसने मेरे लिए काम किया:

ऐसा इसलिए था क्योंकि मेरे पास मेरा बिल्ड आउटपुट डिबग कॉन्फ़िगरेशन के लिए बिन \ डीबग \ और रिलीज़ कॉन्फ़िगरेशन के लिए बिन \ रिलीज़ \ था। जैसे ही मैंने बिल्ड विन्यास को सभी विन्यासों के लिए "बिन \" में बदल दिया (नीचे की छवि के अनुसार) तब सब कुछ काम करना शुरू कर दिया, जैसा कि इसे करना चाहिए !!!

कॉन्फ़िगरेशन बनाएँ

मुझे नहीं पता कि आपके बिल्ड को रिलीज़ और डिबग फ़ोल्डर्स में अलग क्यों करना चाहिए, रेजर सिंटैक्स को तोड़ने का कारण बनना चाहिए, लेकिन ऐसा लगता है क्योंकि कुछ असेंबलियों को नहीं ढूंढ सका। मेरे लिए जो परियोजनाएँ रेजर सिंटैक्स समस्याएँ थीं, वे वास्तव में मेरी 'रेज़र लाइब्रेरी' परियोजनाएँ हैं। वे अनुप्रयोग परियोजनाओं के रूप में सेट हैं, हालांकि मैं उन्हें अपने विचारों को संकलित करने के लिए रेजरगेंसर के साथ कक्षा पुस्तकालयों के रूप में उपयोग करता हूं। जब मैंने वास्तव में इन परियोजनाओं में से एक को सीधे चलाने की कोशिश की, तो इससे निम्नलिखित कॉन्फ़िगरेशन त्रुटि हुई:

फ़ाइल या असेंबली लोड नहीं कर सका 'System.Web.Helpers, Version = 3.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = 31bf3856ad364e35' या इसकी एक निर्भरता। सिस्टम निर्दिष्ट फाइल का पता लगाने में नाकामयाब रहा।

यह मुझे बिल्ड आउटपुट को बदलने की कोशिश करने की ओर ले जाता है, जैसा कि मैंने देखा है कि सभी वेब परियोजनाओं के लिए बिल्ड आउटपुट हमेशा क्लास फ़ोल्डर के लिए डिफ़ॉल्ट के विपरीत, बिन फ़ोल्डर में सीधे होना चाहिए, जिसमें रिलीज़ और डीबग फ़ोल्डर दोनों होते हैं।


1
एक बार dlls बिन फ़ोल्डर में सीधे हैं, इस तरह से पुष्टि की है कि आपको system.web \ संकलन / विधानसभाओं अनुभाग की आवश्यकता नहीं है। यह बस वापस जा रहा है <संकलन डिबग = "सच" लक्ष्यफ़्रामवर्क = "4.5.1" />
सिल्विया

2
पवित्र गाय! बहुत समय तक एक समाधान खोजने के बाद, यह अंत में एक कक्षा पुस्तकालय परियोजना में मेरे रेजर विचारों को हल किया !! बहुत बहुत धन्यवाद।
हुल्ला

2
अविश्वसनीय! मैं अपनी कक्षा की लाइब्रेरी को किसी अन्य प्रोजेक्ट की निर्देशिका में बना रहा था और यह मुद्दा था। काम करने के लिए पथ का निर्माण बिन होना चाहिए। अब पोस्ट बिल्ड xcopy का उपयोग करने के बजाय।
GlacialSpoon

1
मैं एक क्लास लाइब्रेरी प्रोजेक्ट में रेजर इंजन का उपयोग कर रहा हूं और उसी मुद्दे का सामना कर रहा हूं। आउटपुट पथ को "बिन \" पर सेट करना मेरे लिए भी इस समस्या को हल करता है। GlacialSpoon की तरह मैं असेंबली को पोस्ट-बिल्ड चरण में सही आउटपुट फ़ोल्डर में कॉपी करता हूं। सबसे अच्छा तरीका नहीं है, लेकिन कम से कम, Intellisense, विधानसभाओं और वाक्य रचना हाइलाइटिंग कार्यों को संदर्भित करता है।
Octoate

यह ध्यान देने योग्य है कि मूल समस्या फसलों की है यदि आपकी कस्टम आउटपुट निर्देशिका किसी मूल निर्देशिका के लिए इंगित करती है '' .. \ some \ dir \ '। लेकिन अगर आप आउटपुट डायरेक्टरी को 'some \ dir \' कहने के लिए बदलते हैं तो सब कुछ ठीक रहता है। यह सुनिश्चित करने के लिए मैट्रिक्स में एक शैतानी गड़बड़ है।
XDS जू

7

आप इस उत्तर की तलाश में हैं: https://stackoverflow.com/a/4136773/176877

यही है, आंतरिक दृश्य \ 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>

उसे सहेजें, फिर रेज़र फ़ाइल को बंद करें और फिर से खोलें।

यदि आप क्षेत्रों का उपयोग कर रहे हैं, तो आपको प्रत्येक क्षेत्र में प्रत्येक Web.Config के लिए यह करने की आवश्यकता होगी।

विजुअल स्टूडियो ने वर्षों में बगेरियर प्राप्त कर लिया है, इसलिए इसे रेजर फाइल को बंद करने की आवश्यकता हो सकती है जिसमें डिबग बिल्ड चल रहा है, फिर रेजर फाइल को फिर से खोलना, या विजुअल स्टूडियो को पुनरारंभ करने की सबसे खराब आवश्यकता हो सकती है। लेकिन अंततः यह आपके लिए रेजर फ़ाइल पेश करेगा, क्योंकि उस नामस्थान सूची में सब कुछ आपके सभी दृश्यों के शीर्ष पर @use वक्तव्यों में था।


4

में ASP.NET कोर MVC समाधान एक जोड़ने के लिए है usingबजाय यह देखें फ़ोल्डर में web.config जब ASP.NET MVC 5 के साथ काम कर डालने की _ViewImports.cshtml में,।

_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

मेरे लिए मैं एक प्रोजेक्ट का संदर्भ दे रहा था जो एक कंसोल एप्लिकेशन था। इसे क्लास लाइब्रेरी (DLL) के बजाय एक exe (कंसोल एप्लिकेशन) के रूप में बनाने के लिए सेट किया गया था। जब मैंने इसे बदला तो मैं मॉडल को उस अलग प्रोजेक्ट से देख पा रहा था, कोई समस्या नहीं है।


धन्यवाद @ user1619480, मेरे पास एक ही समस्या थी और मेरे मामले में एक .Net फ्रेमवर्क क्लास लाइब्रेरी से मैंने वीएस 2017 का उपयोग करके जोड़ा और किसी कारण से आउटपुट प्रकार कंसोल एप्लिकेशन था।
19

1

रेजर दृश्य में स्मो वस्तुओं का उपयोग करने की कोशिश करते समय मुझे वही त्रुटि मिल रही थी। जाहिरा तौर पर इसका कारण यह है कि रेजर परियोजना में संदर्भित डीएलएल को नहीं पा सकता है। मैंने सभी स्मो डीएल के लिए "कॉपी लोकल" को सही पर सेट करके इसे हल किया, हालांकि एक बेहतर समाधान हो सकता है (ऊपर देखें चेन्दे के लिंक) @use और web.config संपादन बेकार हैं क्योंकि वे केवल तभी आवश्यक हैं जब आप नाम स्थान को छोड़ना चाहते हैं प्रकार के नामों में से भाग (उदाहरण के लिए 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

मुझे पता चला कि जीएसी में मेरे दोनों संस्करण थे। देखें देखें web.configसंदर्भित v1 लेकिन ऐप v2 संदर्भित कर रहा था। संदर्भित असेंबली को हटा दिया गया और फिर से जोड़ा गया v1। का System.Web.WebPages.Razor, आदि।


+1 thx यह मेरा अंतिम बिंदु था, अब मैं asp.net mvc 4 hohoho डिबग कर सकता हूँ!
सिटीकीड

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 फ्रेमवर्क 4.6 में थी जहां परियोजना ने .NET फ्रेमवर्क 4.5 पर सेट किया है।

आशा है कि यह किसी ऐसे व्यक्ति की मदद करेगा जिसने रूपरेखा के साथ खिलवाड़ किया।


1

आपके प्रोजेक्ट फोल्डर का नाम समान होना चाहिए। यदि आपका प्रोजेक्ट या समाधान का नाम अलग है, तो MVC आपको नुकसान पहुंचाएगा।

उदाहरण: यदि आप एक नया एप्लिकेशन बनाते हैं और उसे डिफ़ॉल्ट नाम Webapplicaiton1 मिलता है, तो यह नाम स्थान बनाया जाएगा। तो, हम कहते हैं कि आप इस नेमस्पेस को नहीं रखना चाहते हैं, इसलिए VS से आप हर जगह बदलते हैं जिसे आप "MyNamespace" में देख सकते हैं। आप "Webapplication1" से सभी कोड को भी खोजें और बदलें और इसे "MyNamespace" से बदलें। यह web.config फ़ाइल को भी बदलता है, ताकि यह आवेगित हो

अब रेजर के विचारों को छोड़कर, सब कुछ काम करेगा।

RazorViews इसे खोज नहीं सकते, क्योंकि प्रोजेक्ट के FOLDERNAME पर किसी प्रकार की अजीब निर्भरता है। यह भयानक डिजाइन है।

मैंने अपनी फ़ाइलों को एक नए समाधान में कॉपी करके इस अर्ध-अच्छी तरह से परीक्षण किया है, और एकमात्र अंतर फ़ोल्डरनाम है।


अविश्वसनीय यह कितना हास्यास्पद है! मैंने प्रोजेक्ट फ़ोल्डर का नाम बदलकर दाईं ओर रखा है, और टेक्स्ट फ़ाइल में समाधान खोला है और फ़ोल्डर विवरण को सही किया है! इसने काम कर दिया! मैं दृश्य स्टूडियो 2019 का उपयोग कर रहा हूं
डैनियल

0

अपने नाम MyClassesको वेब में जोड़ने का प्रयास करें

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


0

संपूर्ण नामस्थान शामिल करें

@model namespace.myclasses.mymodel

0

इनमें से कोई भी https://stackoverflow.com/a/7597360/808128 मेरे लिए काम नहीं करता। यहां तक ​​कि "विधानसभा रेफ़रेने को system.web / संकलन / रूट web.config फ़ाइल के असेंबली अनुभाग" में जोड़ना। तो मेरे लिए दो तरीके बने हुए हैं: 1) मेरी विधानसभा के लिए एक सार्वजनिक आवरण वर्ग जोड़ना कि इस आवरण के माध्यम से रेजर कोड इस विधानसभा तक पहुंच सकता है; 2) सिर्फ उसी विधानसभा में एक सार्वजनिक वर्ग के लिए विधानसभा तर्क जोड़ें जहां रेजर का कोड स्थित है।


0

इसके अलावा web.config के लिए <assemblies>और परिवर्तन करने के लिए<namespaces> , मैंने पाया कि GAC'ing विधानसभा एक बड़ा अंतर बना दिया। आप किसी भी कोर .NET असेंबली की तरह संस्कृति और सार्वजनिक कुंजी टोकन को लागू कर सकते हैं जो विश्व स्तर पर पंजीकृत है।

कुछ जीएसी के उल्लेख पर थरथरा सकते हैं। लेकिन एक BizTalk डेवलपर के रूप में मैं इसे गले लगाने के लिए बड़ा हुआ हूं।


0

इस समाधान ने मेरे लिए काम किया (यह हास्यास्पद है, लेकिन काम करता है)

मैंने दृश्य पृष्ठों को संपादित किया और सामग्री को कॉपी किया और उसमें चिपकाया, मैंने किसी भी सामग्री को नहीं बदला, लेकिन सिर्फ दृश्य स्टूडियो को संपादित किया ताकि यह पृष्ठों को ट्रैक करने के लिए काम कर सके, और बाद में हर चीज ने काम करना शुरू कर दिया।

समाधान - बस पृष्ठों को संपादित करें और उसी पृष्ठों के साथ बदलें (मेरे लिए काम किया)



0

मेरे मामले में मैंने जिस पैकेज का उपयोग करने की कोशिश की थी, वह था .net मानक 2.1। जबकि मेरा रेजर क्लास लाइब्रेरी प्रोजेक्ट 2.0 पर सेट था

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.