Razor HtmlHelper Extensions (또는 뷰의 다른 네임 스페이스)를 찾을 수 없음


167

PR이나 베타에서 이런 일이 발생하면 Dunno이지만 on HtmlHelper에서 확장 메소드를 만들면 Razor 기반 페이지에서 인식되지 않습니다.

namespace SomeNamespace.Extensions {
    public static class HtmlExtensions {
        public static string Foo(this HtmlHelper html) {
            return "Foo";
        }
    }
}

나는 다음 <Namespaces>섹션에 추가했습니다 Web.config.

<pages>
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <!-- snip -->
    <add namespace="SomeNamespace.Extensions"/>
  </namespaces>
</pages>

그러나 페이지를 보려고 할 때 컴파일 오류가 발생합니다.

@Html.Foo()

WebForms로 페이지를 다시 만들면 정상적으로 작동합니다. 거래는 무엇입니까?

해결 방법

@using SomeNamespace.ExtensionsRazor 뷰에 포함 하면 작동하지만 훨씬 더 많이 있습니다.Web.config


2
해결 방법조차도 효과가 없습니다. 확장 메서드는 intelliSense에 표시되지만 런타임 중에 컴파일 오류가 발생합니다.
Clark

@using 해결 방법으로 +1 내 경우에는 선호합니다.
Kent

단일 뷰에는 @ 해결 방법을 사용하는 것이 좋습니다. 그러나 여러보기의 경우 코드 관리가 문제가됩니다.
Rahatur

답변:


274

베타 이후 Razor는 네임 스페이스 가져 오기를 전역 적으로 정의하기 위해 다른 구성 섹션을 사용합니다. 당신에 Views\Web.config파일 다음을 추가해야합니다 :

<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" />
      <!-- Your namespace here -->
    </namespaces>
  </pages>
</system.web.webPages.razor>

MVC 3 업그레이드 도구 를 사용하여 올바른 구성 값을 자동으로 확보하십시오.

참고 닫으하고 변경 에디터으로 뽑힐 할 파일을 다시해야 할 수도있다.


1
어셈블리 참조가 누락 되었습니까? System.Web.Mvc.WebViewPage 또는 configSections 섹션의 유형을 인식하지 못합니다.
Clark

4
> System.Web.WebPages.Razor에 대한 참조를 추가하고 정렬했습니다.
TWith2Sugars

4
그것은 나를 위해 작동하지 않습니다. MVC 3 RC를 사용하고 있으며, 네임 스페이스를 views 폴더의 web.config에 추가했습니다. 여전히 Razor 페이지에서 내 확장을 볼 수 없습니다. @using <extensionname>을 사용하는 이벤트가 작동하지 않습니다. @ TWith2Sugars 추가 할 System.Web.WebPages.Razor조차 찾을 수 없으며 System.Web.Razor를 추가했지만 도움이되지 않았습니다. 나는 정말로 여기에 붙어있다
freddoo

31
파일을 열고 닫아 업데이트를 확인하라는 +1
Amir

26
이것이 루트 web.config가 아니라 View 폴더의 web.config임을 지적 해 주셔서 감사합니다!
G-Wiz

11

허용 된 답변에서 알 수 있듯이 구성 파일의 섹션에 추가하여 모든보기에 "사용"을 추가 할 수 있습니다.

그러나 단일 뷰의 경우 사용할 수 있습니다.

@ SomeNamespace.Extensions 사용


6

Razor를 사용하는 MVC 4 응용 프로그램에서 이와 동일한 오류가 발생했습니다. web.config 파일을 정리하기 위해 두 가지 webpages:구성 값을 제거했습니다 .

<appSettings>
  <add key="webpages:Version" value="2.0.0.0" />
  <add key="webpages:Enabled" value="false" />

이러한 구성 값을 복원하면 페이지가 올바르게 컴파일되고 .Partial()확장 방법 과 관련된 오류가 사라졌습니다.


5

VS 2015 에서이 문제가 발생했습니다. 다음 문제가 해결되었습니다.

appsettings에서 "webpages : Version"을 찾아 버전 3.0.0.0으로 업데이트하십시오. 내 web.config에는

<add key="webpages:Version" value="2.0.0.0" />

그리고 나는 그것을 업데이트했다.

<add key="webpages:Version" value="3.0.0.0" />

3

각 섹션의 web.config 에이 섹션을 배치하면 문제가 해결되었습니다.

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
                <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="4.0.0.0" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>

1
사실은 어떤 이유로 루트의 web.config는 (특히 가리키는 내 문제를 일으키는 바인딩 리디렉션 남겼 0.0.0.0-2.0.0.0에를 1.0.0.0)하고, /View/web.config파일이 우선하지 않습니다. (또한, 당신이 모든 것을 필요로한다고 믿지 않습니다 /View/Subfolder/)
JoeBrockhaus

1

이 오류는 프로젝트와 연결된 면도기 엔진이 없음을 나타냅니다.

솔루션 : 솔루션 탐색기 창에서 웹 프로젝트를 마우스 오른쪽 단추로 클릭하고 "Nuget 패키지 관리 ..."를 선택한 다음 "Microsoft ASP.NET Razor"를 설치하십시오. 그러면 올바른 패키지가 설치되고 web.config 파일에 필요한 항목이 추가됩니다.



-6

ASP.NET MVC 3 RTM이 없기 때문에 Razor에 대한 구성 섹션이 필요하지 않습니다. 이러한 섹션은 안전하게 제거 할 수 있습니다.


그것이 사실인지 궁금합니다, nick4eva. 새 MVC 3 웹 응용 프로그램을 만들고 Razor viewengine을 선택하면 Views 폴더에있는 web.config에 기본적으로 면도기 configSections가 있습니다. 비활성화하면 런타임에 컴파일 오류가 발생합니다.
MichaelvR

3
MichaelvR, 예, 제 실수였습니다. 혼란을 드려 죄송합니다.
nick4eva

VB 기반 MVC 프로젝트에도 적용됩니까? 확장 방법에 액세스 할 수 없습니다 ... stackoverflow.com/questions/4789273/…
Ropstah

이 답변은 잘못되었습니다. 이 구성 항목은 여전히 ​​필요합니다. 새 프로젝트 템플릿에는 이미 템플릿이 있지만 Mvc 2 응용 프로그램을 업그레이드하는 경우 템플릿을 추가해야합니다.
marcind
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.