[asp.net-mvc] Razor 기반보기에 참조 된 어셈블리가 표시되지 않음

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

@model MyClasses.MyModel

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

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

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



답변

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를 다시 시작하여 변경 사항을 적용합니다.


답변

동일한 문제가 발생했습니다. 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>

버전, 문화, 토큰 생략은 당분간 괜찮 았지만 향후 수정되어야합니다.


답변

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


답변

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

  • 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 폴더에 직접있는 것처럼 보이므로 빌드 출력을 변경하려고합니다.


답변

이 답변을 찾고있는 것 같습니다 :
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 파일을 표시합니다.


답변

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


답변

저에게는 콘솔 애플리케이션 인 프로젝트를 참조했습니다. 클래스 라이브러리 (DLL) 대신 exe (콘솔 응용 프로그램)로 빌드하도록 설정되었습니다. 이것을 변경했을 때 나는 그 별도의 프로젝트에서 모델을 문제없이 볼 수있었습니다.