Nie znaleziono rozszerzeń Razor HtmlHelper (lub innych przestrzeni nazw dla widoków)

167

Nie wiem, czy to się działo w PR lub Beta, ale jeśli utworzę metodę rozszerzenia na HtmlHelper, nie zostanie ona rozpoznana na stronie zasilanej Razor:

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

Dodałem go do <Namespaces>sekcji w Web.config:

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

Ale generuje błąd kompilacji podczas próby wyświetlenia strony:

@Html.Foo()

Jeśli ponownie utworzę stronę za pomocą formularzy internetowych, będzie działać dobrze. O co chodzi?

Obejście problemu

Jeśli uwzględnię @using SomeNamespace.Extensionsw widoku Razor, to działa, ale wolałbym po prostu mieć to wWeb.config

swilliams
źródło
2
Nawet to obejście nie działa dla mnie. Metoda rozszerzenia pojawi się w intelliSense, ale zgłosi błąd kompilacji w czasie wykonywania.
Clark
+1 dla obejścia @using. Wolę to w moim przypadku.
Kent
@używanie obejścia jest ok dla pojedynczego widoku. Ale w przypadku wielu widoków zarządzanie kodem staje się problemem.
Rahatur,

Odpowiedzi:

274

Od wersji beta Razor używa innej sekcji konfiguracji do globalnego definiowania importu przestrzeni nazw. W swoim Views\Web.configpliku należy dodać:

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

Użyj narzędzia do aktualizacji MVC 3, aby automatycznie upewnić się, że masz odpowiednie wartości konfiguracyjne.

Pamiętaj , że może być konieczne zamknięcie i ponowne otwarcie pliku, aby zmiany zostały odebrane przez redaktora.

marcind
źródło
1
Czy brakuje mi odwołania do zestawu? Nie rozpoznaje System.Web.Mvc.WebViewPage ani żadnego z typów w sekcji configSections.
Clark
4
Musiałem dodać odniesienie do> System.Web.WebPages.Razor i to załatwiło sprawę.
TWith2Sugars
4
Na mnie to nie działa. Używam MVC 3 RC, dodałem moją przestrzeń nazw do web.config w moim folderze widoków. Nadal nie widzę moich rozszerzeń na stronie Razor. Umieszczanie zdarzenia @using <nazwa rozszerzenia> nie działa. @ TWith2Sugars Nie mogę nawet znaleźć System.Web.WebPages.Razor do dodania, dodałem System.Web.Razor, ale nie pomogłem. Naprawdę tu utknąłem
freddoo
31
+1 za polecenie otwarcia i zamknięcia pliku, aby zobaczyć aktualizacje.
Amir,
26
Dziękujemy za wskazanie, że to nie jest główny plik web.config, ale plik web.config w folderze Widok!
G-Wiz
11

Jak sugeruje zaakceptowana odpowiedź, możesz dodać „używanie” do wszystkich widoków, dodając do sekcji pliku konfiguracyjnego.

Ale dla jednego widoku możesz po prostu użyć

@używanie SomeNamespace.Extensions

Paul Rowland
źródło
6

Miałem ten sam błąd w aplikacji MVC 4 używającej Razor. Próbując wyczyścić pliki web.config, usunąłem dwie webpages:wartości konfiguracyjne:

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

Po przywróceniu tych wartości konfiguracyjnych strony kompilowały się poprawnie, a błędy dotyczące .Partial()metody rozszerzenia zniknęły.

John Rasch
źródło
5

Miałem ten problem w VS 2015. Rozwiązano go dla mnie:

Znajdź „strony internetowe: Wersja” w ustawieniach aplikacji i zaktualizuj ją do wersji 3.0.0.0. Mój web.config miał

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

i zaktualizowałem go do

<add key="webpages:Version" value="3.0.0.0" />
Damian Green
źródło
3

Zauważyłem, że umieszczenie tej sekcji w moim pliku web.config dla każdego folderu widoku rozwiązało problem.

<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>
Joseph Morgan
źródło
1
Właściwie stwierdziłem, że z jakiegoś powodu plik web.config ROOT miał przekierowanie wiążące, które powodowało mój problem (w szczególności wskazując 0.0.0.0-2.0.0.0na 1.0.0.0), a /View/web.configplik tego nie zastępuje. (Nie wierzę też, że potrzebujesz tego w każdym /View/Subfolder/)
JoeBrockhaus
1

Ten błąd informuje, że nie masz poprawnie powiązanego silnika maszynki do golenia z projektem.

Rozwiązanie: W oknie Eksploratora rozwiązań kliknij prawym przyciskiem myszy projekt sieci Web i wybierz opcję „Zarządzaj pakietami Nuget ...”, a następnie zainstaluj program „Microsoft ASP.NET Razor”. Zapewni to poprawną instalację pakietu i doda niezbędne wpisy do pliku web.config.

user3459730
źródło
-6

Ponieważ ASP.NET MVC 3 RTM jest już dostępny, nie ma potrzeby sekcji konfiguracji dla Razor. A te sekcje można bezpiecznie usunąć.

nick4eva
źródło
Zastanawiam się, czy to prawda, nick4eva. Jeśli utworzę nową aplikację internetową MVC 3 i wybiorę przeglądarkę Razor, plik web.config, który znajduje się w folderze Views, będzie miał domyślnie konfigurację razor configSections. Jeśli je wyłączę, pojawią się błędy kompilacji w czasie wykonywania.
MichaelvR
3
MichaelvR, tak, to był mój błąd. Przepraszam, że wprowadziłeś zamieszanie.
nick4eva
Czy dotyczy to również projektu MVC opartego na VB? Nie mam dostępu do moich metod rozszerzających ... stackoverflow.com/questions/4789273/…
Ropstah
Ta odpowiedź jest błędna. Te wpisy konfiguracyjne są nadal wymagane. Nowe szablony projektów już je mają, ale jeśli aktualizujesz aplikację Mvc 2, będziesz musiał je dodać.
marcind