วิธีเพิ่มเนมสเปซพิเศษให้กับหน้ามีดโกนแทนที่จะใช้การประกาศ @ ใช้อย่างไร


146

มีเวทมนต์บางอย่างที่ฉันต้องใช้เพื่อรับเนมสเปซในpages/namespacesองค์ประกอบใน 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>

ด้านบนไม่ต้องการทำงาน ฉันรู้ว่าเนมสเปซนั้นใช้ได้เพราะเมื่อฉันวาง@using MyCustomHelpersที่ด้านบนของหน้ามันทำงานได้อย่างน่าอัศจรรย์

นี่คือเพื่อให้ฉันสามารถHtml.SomeFunction()ทำงานได้โดยไม่ต้องใส่@usingที่ด้านบนของทุกหน้าของฉัน


1
คุณใช้ MVC 3 รุ่นใด
marcind

ฉันใช้ MVC 3 Preview ดังนั้นคำตอบอื่น ๆ ที่ใช้ได้สำหรับฉันและยังใช้งานได้แม้หลังจากอัปเกรด ... แต่คำตอบของคุณดูเหมือนจะเหมาะสมกว่าสำหรับเวอร์ชันใหม่ - ซึ่งฉันจะอัปเกรดเป็นไม่ช้า ความอัปยศฉันไม่สามารถยอมรับสองคำตอบ
MyNameIsJob

มันไม่ชัดเจนจากความคิดเห็นในคำตอบ แต่ใน MVC4 เนมสเปซจะต้องเพิ่มลงในไฟล์ Web.Config ในโฟลเดอร์ \ Views ไม่ใช่แอปพลิเคชัน Web.Config <system.web.webPages.razor>ส่วนการตั้งค่าควรมีอยู่แล้วในการที่ Web.Config!
Ben McIntyre

คำตอบ:


163

อัปเดต : โปรดดูคำตอบที่อัปเดตของฉันซึ่งใช้กับ MVC 3 RC: Razor HtmlHelper Extensions (หรือเนมสเปซอื่น ๆ สำหรับการดู) ไม่พบ

สิ่งนี้มีการเปลี่ยนแปลงระหว่าง MVC 3 Preview 1 และ MVC 3 Beta (วางจำหน่ายวันนี้) ใน Preview 1 Razor ใช้ส่วนกำหนดค่าเนมสเปซ WebForms อย่างไรก็ตามในเบต้ามีส่วนกำหนดค่าใหม่ที่แยกจาก WebForms หนึ่ง คุณจะต้องเพิ่ม follwing ไปยังไฟล์ 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>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MyCustomHelpers" />
    </namespaces>
  </pages>
</system.web.webPages.razor>

โปรดทราบว่าคุณอาจต้องปิดและเปิดไฟล์อีกครั้งเพื่อให้การแก้ไขมีการแก้ไข

โปรดทราบว่ามีการเปลี่ยนแปลงอื่น ๆ กับสิ่งที่จำเป็นใน web.config เพื่อให้มีดโกนทำงานใน MVC3 Beta ดังนั้นคุณควรปิดดู~\View\Web.configไฟล์ที่จัดส่งในเทมเพลตโครงการเบต้า


2
FWIW ฉันพบว่าpageBaseType="System.Web.Mvc.WebViewPage"จำเป็นต้องมีแอตทริบิวต์ ฉันได้อัปเดตคำตอบของคุณแล้ว
Portman

1
นี่เป็นวิธีเดียวกับที่คุณทำกับ MVC 3 RC หรือไม่
Clark

1
+1 ขอบคุณ ฉันใช้เวลามากเกินไปในการพยายามค้นหาคำตอบของปัญหานี้ในวันนี้
jessegavin

32
คุณมักจะต้องปิดและเปิดไฟล์. cshtml อีกครั้งหากไฟล์นั้นไม่ทำงานหรือมีข้อผิดพลาด
Simon_Weaver

1
@Simon ใช่คุณต้องอัปเดตไฟล์อีกครั้ง บรรณาธิการตอนนี้ไม่ได้กำลังมองหาการเปลี่ยนแปลง web.config
marcind

50

หากคุณวางการประกาศ namespace ในWeb.configโฟลเดอร์ "Views" ในรูทและ / หรือโฟลเดอร์ "Views" ของพื้นที่ปัจจุบัน (ขึ้นอยู่กับว่ามุมมองของคุณอยู่ที่ใด) - ควรทำงานตามที่คาดไว้


6

ฉันพบhttp://weblogs.asp.net/mikaelsoderstrom/archive/2010/07/30/add-namespaces-with-razor.aspxซึ่งอธิบายวิธีเพิ่มเนมสเปซที่กำหนดเองในหน้ามีดโกนของคุณทั้งหมด

โดยทั่วไปคุณสามารถทำสิ่งนี้

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

และใส่รหัสต่อไปนี้ใน AssemblyInfo.cs ของคุณ

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

วิธีการเริ่มต้นการสมัครจะถูกดำเนินการก่อน Application_Start ใน global.asax


วิธีการย้ายไปยัง System.Web.WebPages.Razor.WebCodeRazorHost.AddGlobalImport ("Fully.Qualified.Namespace");
agrath

4

สำหรับสิ่งที่คุ้มค่าเทคนิคอื่นคือเพียงแค่ใส่คลาสส่วนขยายตัวช่วยของคุณในเนมสเปซระบบที่รวมอยู่ในเอ็นจินการดูโดยค่าเริ่มต้นแล้ว ตัวอย่างเช่น:

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

วิธีนี้ตราบใดที่ไลบรารีที่มีคลาสนั้นถูกอ้างอิงทุกอย่างจะเห็นได้ เนื่องจากคุณกำลังขยายSystem.Web.Mvcคลาสดูเหมือนเป็นที่ยอมรับได้พอสมควรที่จะวางเมธอดส่วนขยายในเนมสเปซเดียวกัน


0

ลองปิดและเปิดมุมมองใหม่หลังจากตรวจสอบให้แน่ใจว่ามีการเปลี่ยนแปลงกับ web.config ในรูทของมุมมอง

การปิดและเปิดใหม่ช่วยแก้ปัญหาของฉัน

ดูที่นี่:

ASP.NET MVC 4 namespace ปัญหาในมุมมองมีดโกน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.