Phần mở rộng dao cạo HtmlHelper (hoặc các không gian tên khác để xem) Không tìm thấy


167

Nếu điều này xảy ra trong PR hoặc Beta, nhưng nếu tôi tạo một phương thức mở rộng trên HtmlHelper, nó sẽ không được nhận ra trong trang hỗ trợ Dao cạo:

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

Tôi đã thêm nó vào <Namespaces>phần trong Web.config:

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

Nhưng nó đưa ra một lỗi biên dịch khi cố gắng xem trang:

@Html.Foo()

Nếu tôi tạo lại trang bằng WebForms, nó hoạt động tốt. Thỏa thuận là gì?

Giải pháp thay thế

Nếu tôi đưa @using SomeNamespace.Extensionsvào chế độ xem Dao cạo của mình, thì nó hoạt động, nhưng tôi chỉ muốn có nó trongWeb.config


2
Ngay cả cách giải quyết cũng không hiệu quả với tôi. Phương thức mở rộng sẽ hiển thị trong intelliSense, nhưng đưa ra lỗi biên dịch trong thời gian chạy.
Clark

+1 cho cách giải quyết @USE. Tôi thích nó trong trường hợp của tôi.
Kent

@USE cách giải quyết là ok cho một lần xem. Nhưng đối với nhiều khung nhìn, việc quản lý mã trở thành một vấn đề.
Ra

Câu trả lời:


274

Kể từ bản Beta, Razor sử dụng một phần cấu hình khác để xác định nhập toàn bộ không gian tên. Trong Views\Web.configtập tin của bạn, bạn nên thêm như sau:

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

Sử dụng công cụ nâng cấp MVC 3 để tự động đảm bảo bạn có các giá trị cấu hình đúng.

Lưu ý rằng bạn có thể cần phải đóng và mở lại tệp cho các thay đổi sẽ được biên tập viên chọn.


1
Tôi có thiếu một tài liệu tham khảo lắp ráp? Nó không nhận ra System.Web.Mvc.WebViewPage hoặc bất kỳ loại nào trong phần configSections.
Clark

4
Tôi đã phải thêm một tham chiếu đến> System.Web.WebPages.Razor và nó đã sắp xếp nó ra.
TWith2Sugars

4
Nó không làm việc cho tôi. Tôi đang sử dụng MVC 3 RC, tôi đã thêm không gian tên của mình vào web.config trong thư mục khung nhìn. Vẫn không thể thấy các tiện ích mở rộng của tôi trong trang Dao cạo. Sự kiện đặt @USE <extensionname> không hoạt động. @ TWith2Sugars Tôi thậm chí không thể tìm thấy System.Web.WebPages.Razor để thêm, tôi đã thêm System.Web.Razor nhưng không giúp được gì. Tôi thực sự bị mắc kẹt ở đây
freddoo

31
+1 để bảo tôi mở và đóng tệp để xem các bản cập nhật.
Amir

26
Cảm ơn bạn đã chỉ ra đây không phải là web.config gốc, mà là web.config trong thư mục Xem!
G-Wiz

11

Vì câu trả lời được chấp nhận cho thấy bạn có thể thêm "bằng cách sử dụng" cho tất cả các chế độ xem bằng cách thêm vào phần của tệp cấu hình.

Nhưng đối với một chế độ xem, bạn chỉ có thể sử dụng

@use someNamespace.Extensions


6

Tôi đã gặp lỗi tương tự trong một ứng dụng MVC 4 bằng cách sử dụng dao cạo. Trong nỗ lực dọn sạch các tệp web.config, tôi đã xóa hai webpages:giá trị cấu hình:

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

Khi tôi khôi phục các giá trị cấu hình này, các trang sẽ biên dịch chính xác và các lỗi liên quan đến .Partial()phương thức tiện ích mở rộng đã biến mất.


5

Tôi đã có vấn đề này trong VS 2015. Sau đây đã giải quyết nó cho tôi:

Tìm "trang web: Phiên bản" trong cài đặt ứng dụng và cập nhật lên phiên bản 3.0.0.0. Web.config của tôi đã có

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

và tôi đã cập nhật nó thành

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

3

Tôi thấy rằng việc đặt phần này trong web.config cho mỗi thư mục xem đã giải quyết nó.

<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
Tôi thực sự thấy rằng vì một số lý do, ROOT web.config có một chuyển hướng ràng buộc gây ra sự cố của tôi (cụ thể là, trỏ 0.0.0.0-2.0.0.0đến 1.0.0.0) và /View/web.configtệp không ghi đè lên điều đó. (Ngoài ra, tôi không tin rằng bạn cần nó trong mọi thứ /View/Subfolder/)
JoeBrockhaus

1

Lỗi này cho bạn biết rằng bạn không có động cơ dao cạo được liên kết đúng với dự án của bạn.

Giải pháp: Trong cửa sổ Solution Explorer, nhấp chuột phải vào dự án web của bạn và chọn "Quản lý gói Nuget ..." sau đó cài đặt "Microsoft ASP.NET Razor". Điều này sẽ đảm bảo rằng gói đúng được cài đặt và nó sẽ thêm các mục cần thiết vào tệp web.config của bạn.



-6

Vì ASP.NET MVC 3 RTM không có phần cấu hình cho dao cạo. Và những phần này có thể được gỡ bỏ một cách an toàn.


Tôi tự hỏi nếu đó là sự thật, nick4eva. Nếu tôi tạo một ứng dụng web MVC 3 mới và chọn chế độ xem Dao cạo, web.config, có trong thư mục Lượt xem, sẽ có cấu hình dao cạo theo mặc định. Nếu tôi vô hiệu hóa chúng, tôi sẽ nhận được các lỗi biên dịch khi chạy.
MichaelvR

3
MichaelvR, vâng, đó là sai lầm của tôi. Tôi xin lỗi vì bạn đã nhầm lẫn.
nick4eva

Điều này cũng được tính cho một dự án MVC dựa trên VB? Tôi không có quyền truy cập vào các phương thức tiện ích mở rộng của mình ... stackoverflow.com/questions/4789273/
Kẻ

Câu trả lời này là sai. Những mục cấu hình vẫn được yêu cầu. Các mẫu dự án mới đã có chúng nhưng nếu bạn đang nâng cấp ứng dụng Mvc 2, bạn sẽ phải thêm chúng.
marcind
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.