Razor HtmlHelper Extensions (หรือเนมสเปซอื่นสำหรับมุมมอง) ไม่พบ


167

Dunno หากสิ่งนี้เกิดขึ้นใน PR หรือเบต้า แต่ถ้าฉันสร้างวิธีการต่อขยายHtmlHelperมันจะไม่ได้รับการยอมรับในหน้ามีดโกนที่ใช้พลังงาน:

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.Extensionsไว้ในมุมมองมีดโกนของฉันแล้วก็ใช้งานได้ แต่ฉันก็อยากจะลองใช้ดูWeb.config


2
แม้แต่วิธีแก้ปัญหาก็ไม่ได้ผลสำหรับฉัน วิธีการขยายจะปรากฏขึ้นใน intelliSense แต่จะเกิดข้อผิดพลาดในการคอมไพล์ระหว่างการรันไทม์
Clark

+1 สำหรับวิธีแก้ปัญหาการใช้ @ ฉันชอบมันในกรณีของฉัน
Kent

@ การใช้วิธีแก้ปัญหานั้นใช้ได้สำหรับมุมมองเดียว แต่สำหรับหลายมุมมองการจัดการรหัสกลายเป็นปัญหา
Rahatur

คำตอบ:


274

ตั้งแต่เบต้ามีดโกนใช้ส่วนกำหนดค่าที่แตกต่างกันสำหรับการกำหนดการนำเข้าเนมสเปซทั่วโลก ใน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 ฉันเพิ่มเนมสเปซของฉันใน web.config ในโฟลเดอร์มุมมองของฉัน ยังไม่เห็นส่วนขยายของฉันในหน้ามีดโกน การใส่กิจกรรม @using <extensionname> ไม่ทำงาน @ TWith2Sugars ฉันไม่สามารถหา System.Web.WebPages.Razor เพื่อเพิ่มฉันเพิ่ม System.Web.Razor แต่ไม่ได้ช่วย ฉันติดอยู่ที่นี่จริงๆ
freddoo

31
+1 เมื่อบอกให้ฉันเปิดและปิดไฟล์เพื่อดูการอัปเดต
Amir

26
ขอบคุณที่ชี้ให้เห็นว่านี่ไม่ใช่ root web.config แต่ web.config ในโฟลเดอร์ View!
G-Wiz

11

ในฐานะที่เป็นคำตอบที่ได้รับการยอมรับแนะนำให้คุณสามารถเพิ่ม "using" ในทุกมุมมองโดยการเพิ่มในส่วนของไฟล์ปรับแต่ง

แต่สำหรับมุมมองเดียวคุณสามารถใช้

@ ใช้ SomeNamespace.Extensions


6

ฉันมีข้อผิดพลาดเดียวกันนี้ในแอปพลิเคชัน 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 สิ่งต่อไปนี้แก้ไขได้สำหรับฉัน:

ค้นหา "หน้าเว็บ: รุ่น" ในการตั้งค่าและอัปเดตเป็นรุ่น 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

ข้อผิดพลาดนี้บอกคุณว่าคุณไม่มีเอ็นจิ้นมีดโกนที่เชื่อมโยงกับโครงการของคุณอย่างเหมาะสม

วิธีแก้ไข: ในหน้าต่างโซลูชัน Explorer คลิกขวาที่โครงการเว็บของคุณและเลือก "จัดการแพคเกจ Nuget ... " จากนั้นติดตั้ง "Microsoft ASP.NET Razor" สิ่งนี้จะทำให้แน่ใจว่ามีการติดตั้งแพ็คเกจอย่างถูกต้องและจะเพิ่มรายการที่จำเป็นลงในไฟล์ web.config ของคุณ



-6

เนื่องจาก ASP.NET MVC 3 RTM ไม่จำเป็นต้องใช้ส่วนกำหนดค่าสำหรับมีดโกน และส่วนเหล่านี้สามารถลบออกได้อย่างปลอดภัย


ฉันสงสัยว่ามันเป็นจริงหรือไม่ nick4eva หากฉันสร้างแอปพลิเคชั่นเว็บ MVC 3 ใหม่และเลือก Razor viewengine web.config ซึ่งมีอยู่ในโฟลเดอร์ Views จะมีการกำหนดค่ามีดโกนตามค่าเริ่มต้น หากฉันปิดการใช้งานฉันจะได้รับข้อผิดพลาดในการคอมไพล์ที่รันไทม์
MichaelvR

3
MichaelvR ใช่มันเป็นความผิดพลาดของฉัน ฉันขอโทษที่คุณป้อนด้วยความสับสน
nick4eva

สิ่งนี้นับรวมสำหรับโครงการ MVC ที่ขับเคลื่อนด้วย VB หรือไม่? ฉันไม่สามารถเข้าถึงวิธีการขยายของฉันได้ ... stackoverflow.com/questions/4789273/…
Ropstah

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