Razor 기반보기에 참조 된 어셈블리가 표시되지 않음


101

다른 어셈블리의 클래스를 기반으로 강력한 형식의 뷰를 만들려고합니다. 그러나 어떤 이유로 든 내 Razor 뷰에는 내 프로젝트에서 참조되는 다른 어셈블리가 표시되지 않는 것 같습니다. 예 :

@model MyClasses.MyModel

Visual Studio 2010에서 "유형 또는 네임 스페이스 이름을 MyClasses찾을 수 없습니다 (using 지시문 또는 어셈블리 참조가 누락 되었습니까?)"라는 오류가 발생합니다.

표준보기 엔진에서 참조 된 동일한 클래스가 제대로 작동합니다. 내 견해의 본문에서 클래스를 참조하는 데 동일한 문제가 있습니다.

Razor에 대해 뭔가 빠졌거나 다른 방식으로 어셈블리를 참조해야합니까?


전체 네임 스페이스를 사용하고 있습니까? @model 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 문을 추가 할 수 있습니다.

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

Web.config를 편집 한 후 Visual Studio를 다시 시작하여 변경 사항을 적용합니다.


18
이것은 작동하지만 어셈블리가 Copy Local = true. 그렇지 않으면 외부 어셈블리가 작동하지 않을 수 있습니다.
Terry

1
실제 뷰 파일을 사용하는 대신 "가상"소스 (예 : DB)의 뷰를 사용하는 경우 뷰의 코드가 작동하려면이 파일을 ROOT web.config 파일에 넣어야합니다.
NightOwl888 2013 년

2
@Terry, 일부 시스템 루트 네임 스페이스 어셈블리의 경우에도 Copy local = true가 필요한 것으로 보입니다.
Dan Esparza

2
내 어셈블리는 런타임에로드되므로 web.config 파일을 사용하여 추가 할 수 없습니다. 내가 시도 할 수있는 다른 것이 있습니까? 자체 web.config 파일과 함께 내 외부보기를 가져 오는 방법이 있습니까? 내 뷰와 동일한 어셈블리 내에서 네임 스페이스를 참조하기 때문에 다소 이상합니다.
Maksim Vi.

Visual Studio를 다시 시작할 필요가 없습니다. 뷰를 닫고 다시 여는 것만으로 충분합니다.
user247702 2015-09-09

58

동일한 문제가 발생했습니다. MVC3 Project MyCore.Web이 동일한 솔루션 (어셈블리 이름 MyCoreDBLayer 사용)의 다른 프로젝트에서 MyCore.DBLayer 네임 스페이스를 참조했습니다. MyCore.DBLayer의 모든 개체는 컨트롤러 및 모델에서 완벽하게 작동했지만 Razor 뷰에서는 'The type or namespace name'DBLayer 'does not exist in the namespace'MyCore '(A you missing an assembly reference?)' 라는 오류와 함께 실패했습니다. 분명히 그렇지 않습니다.

  • 로컬 복사 옵션이 true로 설정되었습니다.
  • Razor 뷰에서 "using ..."문을 추가하는 것은 쓸모가 없었습니다.
  • system.web.webPages.razor 섹션에 네임 스페이스를 추가하는 것도 쓸모가 없었습니다.

루트 web.config 파일의 system.web / compilation / assemblies 섹션에 어셈블리 참조를 추가하면 문제가 해결되었습니다. 이제 섹션은 다음과 같습니다.

<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 모델로 공용 클래스를 작성했습니다. Razor 뷰에서 MVC의 모델 네임 스페이스에있는 다른 클래스를 사용해서는 안된다고 생각합니다. 항상 래퍼를 작성할 수 있습니다
VB

이것은 나를 위해 일했으며에 추가하려고 시도 Views/web.config했으며 거기에 배치되었을 때도 작동했습니다.
guanome

18

제 경우에는 네임 스페이스가 포함 된 별도의 프로젝트가 콘솔 애플리케이션이었습니다. 클래스 라이브러리로 변경하면 문제가 해결되었습니다.


1
이것은 나를 위해 그것을 해결했습니다. 먼저 클래스 라이브러리 (패키지)를 만들려고했지만 필요한 너겟 패키지를 참조하는 데 문제가 발생했습니다. 화려하지 말고 기본 클래스 라이브러리 (DLL)를 만드는 것이
가장 좋습니다

15

위의 어느 것도 나를 위해 일하지 않았습니다.

  • DLL이 로컬 복사로 설정되었습니다.
  • 두 web.configs에 네임 스페이스를 추가하면 아무 작업도 수행되지 않았습니다.
  • system.web \ compilation \ assemblies에 어셈블리 참조를 추가하는 것도 도움이되지 않았습니다 (이 참조를 제거하지는 않았지만 필요하기 때문일 수 있음).

그러나 마침내 나는 나를 위해 일한 것을 발견했습니다.

빌드 출력이 디버그 구성의 경우 bin \ Debug \로 이동하고 릴리스 구성의 경우 bin \ Release \로 이동했기 때문입니다. 모든 구성 (아래 이미지에 따라)에 대해 빌드 구성을 "bin \"으로 변경하자마자 모든 것이 제대로 작동하기 시작했습니다 !!!

빌드 구성

빌드를 Release 및 Debug 폴더로 분리하면 Razor 구문이 손상되는 이유는 알 수 없지만 어셈블리를 찾을 수 없기 때문인 것 같습니다. 저에게 면도기 구문 문제가있는 프로젝트는 실제로 제 '면도기 라이브러리'프로젝트입니다. 그들은 응용 프로그램 프로젝트로 설정되지만 RazorGenerator와 함께 클래스 라이브러리로 사용하여 뷰를 컴파일합니다. 실제로 이러한 프로젝트 중 하나를 직접 실행하려고하면 다음 구성 오류가 발생했습니다.

파일 또는 어셈블리 'System.Web.Helpers, 버전 = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35'또는 해당 종속성 중 하나를로드 할 수 없습니다. 시스템이 지정된 파일을 찾을 수 없습니다.

이로 인해 모든 웹 프로젝트의 경우 빌드 출력이 릴리스 및 디버그 폴더가 모두있는 클래스 라이브러리의 기본값과 달리 항상 bin 폴더에 직접있는 것처럼 보이므로 빌드 출력을 변경하려고합니다.


1
dll이 bin 폴더에 직접 있으면 system.web \ compilation \ assemblies 섹션이 필요하지 않음을 확인했습니다. 이것은 <compilation debug = "true"targetFramework = "4.5.1"/>로 돌아갈 수 있습니다
Sylvia

2
이런 젠장! 솔루션을 찾는 데 많은 시간을 보낸 후 마침내 클래스 라이브러리 프로젝트의 Razor 뷰가 해결되었습니다 !! 정말 고맙습니다.
Hullah

2
믿을 수 없는! 다른 프로젝트의 디렉토리에 뷰의 클래스 라이브러리를 빌드하고 있었는데이 문제가 발생했습니다. 이 작업을 수행하려면 빌드 경로가 bin \이어야합니다. 이제 포스트 빌드 xcopy를 대신 사용합니다.
GlacialSpoon

1
클래스 라이브러리 프로젝트에서 Razor 엔진을 사용하고 있으며 동일한 문제에 직면했습니다. 출력 경로를 "bin \"으로 설정하면이 문제도 해결되었습니다. GlacialSpoon과 마찬가지로 빌드 후 단계의 어셈블리를 올바른 출력 폴더에 복사합니다. 최선의 방법은 아니지만 적어도 Intellisense, 참조 어셈블리 및 구문 강조 표시가 작동합니다.
옥토 에이트

사용자 정의 출력 디렉토리가 상위 디렉토리 ala '.. \ some \ dir \'을 가리키는 경우 원래 문제가 발생한다는 점에 주목할 가치가 있습니다. 그러나 출력 디렉토리를 'some \ dir \'로 변경하면 모든 것이 잘 작동합니다. 이것은 확실히 매트릭스의 사악한 결함입니다.
XDS

7

이 답변을 찾고있는 것 같습니다 : https://stackoverflow.com/a/4136773/176877

즉, 내부 Views \ 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를 다시 시작해야 할 수 있습니다. 그러나 궁극적으로 네임 스페이스 목록의 모든 항목이 모든 뷰의 맨 위에있는 @using 문에있는 것처럼 Razor 파일을 표시합니다.


4

에서 ASP.NET 코어 MVC 솔루션은 추가하는 using대신 ASP.NET MVC (5)와 함께 작업 할 때이보기 폴더에 web.config 반면 퍼팅의, _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에게 감사드립니다. 동일한 문제가 발생했으며 제 경우에는 VS 2017을 사용하여 추가 한 .Net Framework 클래스 라이브러리에서 어떤 이유로 출력 유형이 콘솔 응용 프로그램이었습니다.
danfer

1

Razor보기에서 Smo 개체를 사용하는 동안 동일한 오류가 발생했습니다. 이는 Razor가 프로젝트에서 참조 된 DLL을 찾을 수 없기 때문입니다. 모든 Smo dll에 대해 "로컬 복사"를 true로 설정하여이 문제를 해결했지만 더 나은 솔루션이있을 수 있습니다 (위의 Czechdude 링크 참조) @using 및 web.config 편집은 네임 스페이스를 생략하려는 경우에만 필요하기 때문에 쓸모가 없습니다. 유형 이름의 일부 (예 : Microsoft.SqlServer.Management.Smo.Server 대신 Server)


1

내 dev 컴퓨터를 Win7 32 비트에서 Win7 64 비트로 이동 한 후 비슷한 오류가 발생했습니다. 에러 메시지:

...\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에 두 버전이 모두 있습니다. View는 web.configv1을 참조했지만 앱은 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.5로 설정된 .NET Framework 4.6에있었습니다.

이것이 프레임 워크를 망친 사람에게 도움이되기를 바랍니다.


1

프로젝트 폴더 이름은 동일해야합니다. 프로젝트 또는 솔루션 이름이 다른 경우 MVC가 당신을 해칠 것입니다.

예 : 새 애플리케이션을 생성하고 기본 이름 Webapplicaiton1을 가져 오면이 네임 스페이스가 생성됩니다. 따라서이 네임 스페이스를 원하지 않는다고 가정 해 보겠습니다. 따라서 VS에서 볼 수있는 모든 곳에서 "MyNamespace"로 변경합니다. 또한 "Webapplication1"에서 모든 코드를 검색하여 바꾸고 "MyNamespace"로 바꿉니다. 이것은 또한 web.config 파일을 변경하므로

이제 Razor 뷰를 제외한 모든 것이 작동합니다.

프로젝트의 FOLDERNAME에 이상한 종속성이 있기 때문에 RazorViews에서 찾을 수 없습니다. 끔찍한 디자인입니다.

내 파일을 새 솔루션에 복사하여이 부분을 철저히 테스트했으며 유일한 차이점은 폴더 이름입니다.


이것이 얼마나 우스꽝 스러운지 놀랍습니다! 프로젝트 폴더 이름을 오른쪽으로 변경하고 솔루션을 텍스트 파일로 열고 폴더 설명을 수정했습니다! 작동했습니다! 미안 비주얼 스튜디오 2019를 사용
다니엘

0

현재있는 네임 스페이스 MyClasses를 web.config에 추가해보십시오.

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


0

전체 네임 스페이스 포함

@model namespace.myclasses.mymodel

0

https://stackoverflow.com/a/7597360/808128 중 어느 것도 나를 위해 작동하지 않습니다. "루트 web.config 파일의 system.web / compilation / assemblies 섹션에 어셈블리 참조를 추가"하는 경우도 있습니다. 그래서 두 가지 방법이 남아 있습니다. 1) Razor 코드가이 랩을 통해이 어셈블리에 액세스 할 수있는 어셈블리에 대한 공용 랩 클래스를 추가합니다. 2) Razor의 코드가있는 동일한 어셈블리의 공용 클래스에 어셈블리 논리를 추가하기 만하면됩니다.


0

<assemblies><namespaces>에 대한 web.config를 변경 하는 것 외에도 어셈블리를 GAC로 변경하면 큰 차이가 있음을 발견했습니다. 전역으로 등록 된 모든 핵심 .NET 어셈블리처럼 문화권 및 공개 키 토큰을 적용 할 수 있습니다.

일부는 GAC에 대한 언급에 떨릴 수 있습니다. 하지만 BizTalk 개발자로서 저는이를 수용하기 위해 성장했습니다.


0

이 솔루션은 나를 위해 일했습니다 (재미 있지만 작동합니다)

뷰 페이지를 편집하고 내용을 복사하여 붙여넣고 뷰의 내용을 변경하지 않고 편집 만하면 비주얼 스튜디오가 페이지를 추적 할 수 있고 그 후 모든 것이 작동하기 시작했습니다.

솔루션-페이지를 편집하고 동일한 페이지로 교체 (Worked for me)


0

spacename 모델, yourClassModel에서 이름 클래스 앞에 public을 추가하십시오.

public class yourClassModel{
    prop
}

0

제 경우에는 사용하려는 패키지가 .net 표준 2.1을 참조하는 반면 면도기 클래스 라이브러리 프로젝트는 2.0으로 설정되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.