MVC 4 - ใช้ Razor Views ใน Class Library

ฉันกำลังพยายามมี MVC 4 Razor View ในโครงการ Class Library

ฉันเพิ่มไฟล์ Web.Config ลงในโฟลเดอร์รูทของไลบรารีคลาสและโฟลเดอร์มุมมอง แต่ในมุมมอง @model ของฉันยังคงไม่ได้รับการยอมรับ

ฉันยังเพิ่มแพ็คเกจ Microsoft.AspNet.Mvc ให้กับโปรเจ็กต์ด้วย

ไม่มีใครรู้วิธีการแก้ปัญหานี้หรือไม่?

นี่คือไฟล์ Web.Config ของฉัน:

1 - โฟลเดอร์มุมมอง

<?xml version="1.0"?>

<configuration>
  <configSections>
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
      <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=2.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=4.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" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>

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

  <system.web>
    <httpHandlers>
      <add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
    </httpHandlers>

    <!--
        Enabling request validation in view pages would cause validation to occur
        after the input has already been processed by the controller. By default
        MVC performs request validation before a controller processes the input.
        To change this behavior apply the ValidateInputAttribute to a
        controller or action.
    -->
    <pages
        validateRequest="false"
        pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
        userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
    </pages>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />

    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
    </handlers>
  </system.webServer>
</configuration>

2 - โฟลเดอร์รูท

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <httpRuntime targetFramework="4.5" />
    <compilation debug="true" targetFramework="4.5" />
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <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" />
      </namespaces>
    </pages>
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>

ไม่มีใครรู้ว่าฉันพลาดอะไรไป?

ขอบคุณ,

มิเกล


person Miguel Moura    schedule 14.09.2012    source แหล่งที่มา
comment
คุณหมายถึงอะไรคุณกำลังพยายามเรียกใช้มุมมองในไลบรารีของชั้นเรียน? ไม่สมเหตุสมผลเลย ฉันไม่คิดว่าคำถาม/เป้าหมายของคุณชัดเจนนัก   -  person naspinski    schedule 15.09.2012


คำตอบ (2)


โครงการของคุณต้องเป็นเว็บแอปพลิเคชันเพื่อให้ Intellisense ทำงานได้อย่างถูกต้อง Web Application เป็นเพียงไลบรารีคลาสพิเศษ

person Max Toro    schedule 14.09.2012

ปรากฎว่า วิธีแก้ปัญหาง่ายๆ คือการสร้างเป็น เว็บแอปพลิเคชัน แต่นั่นอาจไม่เหมาะกับทุกคน

ความพยายามครั้งแรก

ตัวฉันเองยังมี ไลบรารีของชั้นเรียน ที่ฉันต้องการสร้างการควบคุมบางอย่าง แต่ฉันก็ยังอยากมี Razor View ที่ใช้งานได้ พร้อมด้วย สติปัญญาเต็มรูปแบบ สนับสนุน. เคล็ดลับก็คือ:

  1. เพิ่มข้อมูลอ้างอิง (สำหรับ MVC)
  2. เพิ่ม ProjectTypeGuids ให้กับ .csproj (แก้ไขเป็นข้อความ) หลัง ProjectGUID: <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
  3. เพิ่มไฟล์ .cshtml Razor View (จะไม่ทำงานจนกว่าจะถึงส่วนถัดไป)
  4. เพิ่มไฟล์ Web.Config (ดูโฟลเดอร์ View web.config ของคุณ)
  5. เปลี่ยนเส้นทางเอาต์พุต Project Properties Build เป็น bin\ (ไม่ใช่ bin\Debug)
  6. ทำความสะอาดและสร้างโซลูชัน

ทำให้คุณเกือบจะถึงจุดนั้น (ความคิดเห็นพูดถึงปัญหาโฟลเดอร์ Bin): https://conficient.wordpress.com/2013/11/27/asp-net-razor-views-in-class-libraries/

คู่มืออื่นที่มี Bin รวมอยู่ด้วย: http://thetoeb.de/2014/01/05/enabling-mvc5-intellisense-in-a-classlibrary-project/

แต่ชี้เฉพาะไปยังสิ่งใดสิ่งหนึ่งก็คือหากคุณหลีกเลี่ยงการมีไซต์ ASP.Net MVC จริง ดังนั้น ตอนนี้คุณจะต้องมีบางอย่างเพื่อรันมัน... และมีตัวเลือกมากมาย แต่นั่นอยู่นอกเหนือรายการนี้


เกือบจะมี

หากคุณเพียงต้องการให้รวบรวมมุมมองของคุณ และนำกลับมาใช้ใหม่เป็นโปรเจ็กต์โดยโปรเจ็กต์ ASP.Net MVC จริงอื่นๆ มากมาย คุณก็แค่ ใช้ Razor Generator แทน แต่ถึงแม้จะยังอยู่ที่นี่ คุณก็อาจ ไม่ต้องการสร้างโครงการของคุณเป็นไลบรารีของ Class เพราะมันไม่สนุกเลย...

  1. ติดตั้ง VS Extension สำหรับ Razor Generator
  2. เพิ่ม โครงการ ไลบรารีของชั้นเรียน ใหม่
  3. เพิ่มแพ็คเกจ NuGet ลงในไลบรารีของคุณสำหรับ RazorGenerator.Mvc
  4. เพิ่มแพ็คเกจ NuGet ไปยังไลบรารีของคุณสำหรับ PrecompiledMvcViewEngineContrib
  5. สร้างโฟลเดอร์ Views และ โฟลเดอร์ชื่อคอนโทรลเลอร์ ใต้โฟลเดอร์นั้นในไลบรารีของคุณสำหรับเส้นทางไวรัสที่คุณต้องการให้เข้าถึงสิ่งเหล่านี้
  6. ย้าย มุมมอง ใดๆ ไปยังโฟลเดอร์ \Views\ControllerName\ ใหม่นั้น
  7. ตั้งค่ามุมมองไลบรารีทั้งหมดเหล่านี้เป็น Custom Tool RazorGenerator (คลิกขวาที่คุณสมบัติในมุมมอง)
  8. เพิ่มการอ้างอิงไปยังไลบรารีของคุณจากเว็บแอปพลิเคชัน ASP.Net MVC จริงของคุณ

จากนั้นฉันมักจะยังมีปัญหาอยู่ ฉันจะติดอยู่ใน C# 2.0 เว้นแต่ฉันจะเพิ่มแพ็คเกจ nuget Microsoft.CodeDom.Providers.DotNetCompilerPlatform ซึ่งสำหรับ 4.5 ดังนั้นสำหรับ 4.6.x เราสามารถแก้ไขส่วน codedom ใหม่ใน app.config เป็น

  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701">
        <providerOption name="CompilerVersion" value="v4.0"/>
      </compiler>
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+"/>
    </compilers>
  </system.codedom>

ตอนนี้คุณสามารถใช้ "var" เป็นประเภทโดยนัยและคุณสมบัติ C# สมัยใหม่อื่น ๆ ได้

ต่อไปฉันมีปัญหากับวิธีการขยาย System.Linq ไม่พบแม้ว่าจะอ้างอิงแล้วก็ตาม ... และชีวิตก็ไม่ค่อยถูกต้อง ... หากคุณต้องการมันทั้งหมด ... แต่นั่นคือการเริ่มต้นถ้านั่นคือเส้นทางของคุณ อยากจะเดินลงไปอีก


ตัวเลือกที่ง่ายที่สุด

แต่ถ้าคุณปฏิบัติตามคำแนะนำของทีมงาน Razor Generator และติดตั้ง Razor Generator ไว้บน MVC Web Application ปกติ (เพียงสร้าง "ไลบรารี ของคุณ strong>" เป็นอันหนึ่ง) แทบไม่ต้องทำงานนี้เลย...

  1. มีไซต์ MVC ASP.Net หลักจริง
  2. สร้างไซต์ MVC ASP.Net ใหม่เพื่อทำหน้าที่เป็น "ไลบรารี" ของคุณ ดังนั้นคุณจึงไม่ต้องยุ่งกับสิ่งต่าง ๆ มากนัก
  3. ติดตั้งแพ็คเกจ Nuget สำหรับ RazorGenerator.MVC ไปที่ "library"
  4. ติดตั้งแพ็คเกจ Nuget สำหรับ PrecompiledMvcViewEngineContrib เป็น "library"
  5. ย้ายมุมมองไปยังโครงสร้างที่คล้ายกันในไลบรารีและทำเครื่องหมายเป็น Custom Tool RazorGenerator
  6. อ้างอิง "ไลบรารี" ของคุณจากไซต์หลัก และทั้งหมดนี้จะทำงานได้อย่างยุ่งยากน้อยลงด้วยวิธีนี้

ข้อดีก็คือ "ไลบรารี" ที่คุณอ้างอิงถึงมีโค้ด App Start ที่จะรันเมื่อเริ่มแอพของแอพหลักของคุณ และจะลงทะเบียน PreCompiledViewEngine ซึ่งรู้เกี่ยวกับพาธไวรัส ไม่ใช่แค่พาธทางกายภาพ จากนั้นมุมมองเครื่องมือแบบกำหนดเองของ RazorGenerator จะกำหนดเส้นทางเสมือน และเมื่อแก้ไขเส้นทางมุมมองแล้ว ก็จะสามารถค้นพบได้


การอ้างอิงที่ดีในหัวข้อ: https://www.c-sharpcorner.com/UploadFile/97fc7a/article-precompiled-razor-view-using-razorgenerator-mvc-and/

person Greg    schedule 23.03.2019
comment
หากคุณอยู่บนเส้นทางนี้ อาจใช้เวลาไม่นานก่อนที่คุณจะต้องการเสริมพลังให้กับประเภทเพจฐาน Razor ไม่ทางใดก็ทางหนึ่ง ประเภทฐานของหน้าสามารถเปลี่ยนแปลงได้ผ่านทาง web.config ‹pages pageBaseType=System.Web.Mvc.WebViewPage› haacked.com/archive/2011/02/21/ - person Greg; 23.03.2019