Làm cách nào để thêm không gian tên bổ sung vào các trang Dao cạo thay vì khai báo @USE?


146

Có một số loại phép thuật tôi cần sử dụng để có được các không gian tên trong thành pages/namespacesphần trong webconfig?

<pages>
    <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="System.Web.WebPages"/>
        <add namespace="System.Web.Helpers"/>
        <add namespace="MyCustomHelpers"/>
    </namespaces>
</pages>

Ở trên chỉ không muốn làm việc. Tôi biết không gian tên là tốt bởi vì khi tôi đặt @using MyCustomHelpersở đầu trang, nó hoạt động một cách kỳ diệu.

Điều này là để tôi có thể Html.SomeFunction()làm việc mà không phải đặt @usingở đầu tất cả các trang của mình


1
Bạn đang sử dụng phiên bản nào của MVC 3?
marcind

Tôi đã sử dụng MVC 3 Preview để câu trả lời khác hoạt động với tôi và vẫn hoạt động, ngay cả sau khi nâng cấp ... tuy nhiên câu trả lời của bạn có vẻ phù hợp hơn với phiên bản mới - mà tôi sẽ nâng cấp lên ngay. Thật xấu hổ tôi không thể chấp nhận hai câu trả lời.
MyNameIsJob

Không rõ ý kiến ​​trong các câu trả lời, nhưng trong MVC4, không gian tên cần được thêm vào tệp Web.Config trong thư mục \ Views, KHÔNG phải ứng dụng Web.Config. Phần <system.web.webPages.razor>cấu hình đã tồn tại trong THAT Web.Config!
Ben McIntyre

Câu trả lời:


163

Cập nhật : vui lòng xem câu trả lời được cập nhật của tôi áp dụng cho MVC 3 RC: Phần mở rộng HtmlHelper của Dao cạo (hoặc các không gian tên khác để xem) Không tìm thấy

Điều này đã thay đổi giữa MVC 3 Preview 1 và MVC 3 Beta (được phát hành ngày hôm nay). Trong Bản xem trước 1 Dao cạo đã sử dụng phần cấu hình không gian tên WebForms. Tuy nhiên, trong bản Beta có một phần cấu hình mới tách biệt với phần WebForms. Bạn sẽ cần thêm follwing vào tệp web.config (hoặc chỉ bắt đầu với một dự án hoàn toàn mới từ mẫu):

<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>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MyCustomHelpers" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

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.

Lưu ý rằng có những thay đổi khác đối với những gì được yêu cầu trong web.config để giúp Dao cạo hoạt động trong MVC3 Beta, vì vậy tốt nhất bạn nên xem ~\View\Web.configtệp gửi trong các mẫu dự án Beta.


2
FWIW, tôi đã thấy rằng pageBaseType="System.Web.Mvc.WebViewPage"thuộc tính cũng được yêu cầu. Tôi đã cập nhật câu trả lời của bạn.
Portman

1
Đây có giống như cách bạn sẽ làm với MVC 3 RC không?
Clark

1
+1 CẢM ƠN BẠN. Tôi đã dành quá nhiều thời gian để cố gắng tìm câu trả lời cho vấn đề này ngày hôm nay.
jessegavin

32
rất có thể bạn sẽ cần phải đóng và mở lại tệp .cshtml nếu nó không hoạt động hoặc báo lỗi
Simon_Weaver

1
@Simon có, bạn cần cập nhật mở lại tập tin. Trình chỉnh sửa ngay bây giờ không xem các thay đổi của web.config.
marcind

50

Nếu bạn đặt khai báo không gian tên của mình trong Web.configthư mục "Lượt xem" gốc và / hoặc thư mục "Lượt xem" của khu vực hiện tại (tùy thuộc vào vị trí của chế độ xem của bạn) - thì nó sẽ hoạt động như mong đợi.


6

Tôi tìm thấy http://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspx giải thích cách thêm một không gian tên tùy chỉnh cho tất cả các trang dao cạo của bạn.

Về cơ bản bạn có thể làm điều này

using Microsoft.WebPages.Compilation;
public class PreApplicationStart
{
   public static void InitializeApplication()
   {
       CodeGeneratorSettings.AddGlobalImport("Custom.Namespace");
   }
}

và đặt đoạn mã sau vào hội nghịInfo.cs của bạn

[assembly: PreApplicationStartMethod(typeof(PreApplicationStart), "InitializeApplication")]

phương thức InitializeApplication sẽ được thực thi trước Application_Start trong global.asax


Phương thức được chuyển sang System.Web.WebPages.Razor.WebCodeRazorhost.AddGlobalImport ("Full.Qualified.Namespace");
agrath

4

Để biết giá trị của nó, một kỹ thuật khác là chỉ cần đặt lớp mở rộng của trình trợ giúp của bạn vào một không gian tên Hệ thống đã được công cụ xem bao gồm theo mặc định. Ví dụ:

namespace System.Web.Mvc
{
    public static class HtmlHelper_MyExtensions
    {
        ...
    }
}

Bằng cách này, miễn là thư viện chứa lớp được tham chiếu, mọi thứ sẽ thấy nó. Vì bạn đang mở rộng một System.Web.Mvclớp, nên có thể chấp nhận hợp lý để đặt các phương thức mở rộng trong cùng một không gian tên.


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.