MVC 4 - Gunakan Tampilan Pisau Cukur di Perpustakaan Kelas

Saya mencoba memiliki MVC 4 Razor View di Proyek Perpustakaan Kelas.

Saya menambahkan file Web.Config ke folder root perpustakaan kelas dan folder tampilan saya tetapi dalam tampilan saya @model masih belum dikenali.

Saya juga menambahkan paket Microsoft.AspNet.Mvc ke proyek tersebut.

Adakah yang tahu cara mengatasi ini?

Ini adalah file Web.Config saya:

1 - Tampilan Folder

<?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 - Folder akar

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

Adakah yang tahu apa yang saya lewatkan?

Terima kasih,

Miguel


person Miguel Moura    schedule 14.09.2012    source sumber
comment
Apa maksud Anda mencoba menjalankan tampilan di perpustakaan kelas? Itu tidak masuk akal - menurut saya pertanyaan/tujuan Anda tidak begitu jelas.   -  person naspinski    schedule 15.09.2012


Jawaban (2)


Proyek Anda harus berupa Aplikasi Web agar intellisense dapat berfungsi dengan baik. Aplikasi Web hanyalah perpustakaan kelas khusus.

person Max Toro    schedule 14.09.2012

Ternyata solusi mudah adalah dengan membuatnya sebagai aplikasi web, namun hal ini mungkin tidak cocok untuk semua orang.

Percobaan pertama

Saya sendiri juga memiliki perpustakaan kelas di mana saya ingin membuat beberapa kontrol, namun saya ingin memiliki Razor View yang berfungsi, dengan kecerdasan penuh mendukung. Triknya adalah:

  1. Tambahkan Referensi (untuk MVC)
  2. Tambahkan ProjectTypeGuids ke .csproj (edit sebagai teks) setelah ProjectGUID: <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
  3. Tambahkan file .cshtml tampilan pisau cukur (ini tidak akan berfungsi hingga bagian selanjutnya)
  4. Tambahkan file Web.Config (lihat folder View web.config Anda)
  5. Ubah jalur keluaran Project Properties Build menjadi bin\ (bukan bin\Debug)
  6. Solusi Bersih dan Bangun

Membuat Anda hampir sampai (komentar menyebutkan masalah folder Bin): https://conficient.wordpress.com/2013/11/27/asp-net-razor-views-in-class-libraries/

Panduan lain dengan Bin disertakan: http://thetoeb.de/2014/01/05/enabling-mvc5-intellisense-in-a-classlibrary-project/

Namun satu-satunya poin untuk semua itu adalah jika Anda menghindari memiliki situs ASP.Net MVC yang sebenarnya. Jadi, sekarang Anda memerlukan sesuatu untuk menjalankannya... dan ada pilihan, tapi itu di luar entri ini.


Hampir sampai

Jika Anda hanya ingin pandangan Anda dikompilasi, dan digunakan kembali sebagai proyek oleh banyak proyek ASP.Net MVC nyata lainnya, maka Anda bisa Gunakan Razor Generator , tapi meski masih di sini, Anda mungkin tidak ingin membuat proyek Anda sebagai perpustakaan Kelas, karena itu tidak menyenangkan...

  1. Instal Ekstensi VS untuk Razor Generator
  2. Tambahkan Proyek Perpustakaan Kelas baru
  3. Tambahkan paket NuGet ke perpustakaan Anda untuk RazorGenerator.Mvc
  4. Tambahkan paket NuGet ke perpustakaan Anda untuk PrecompiledMvcViewEngineContrib
  5. Buat folder Views dan folder bernama pengontrol di bawahnya dalam perpustakaan Anda untuk jalur virtual yang ingin Anda akses sebagai
  6. Pindahkan semua tampilan ke folder \Views\ControllerName\ yang baru
  7. Setel semua tampilan perpustakaan ini ke Custom Tool RazorGenerator (klik kanan properti pada tampilan)
  8. Tambahkan referensi ke perpustakaan Anda dari aplikasi web ASP.Net MVC Anda yang sebenarnya

Dari situ saya masih sering mendapat masalah. Saya akan terjebak di C# 2.0 kecuali saya menambahkan paket nuget Microsoft.CodeDom.Providers.DotNetCompilerPlatform. Yaitu untuk 4.5, jadi untuk 4.6.x seseorang dapat memodifikasi bagian codedom baru di app.config menjadi

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

Sekarang Anda dapat menggunakan "var" sebagai tipe implisit dan fitur C# modern lainnya.

Selanjutnya saya mempunyai masalah dengan metode ekstensi System.Linq yang tidak ditemukan meskipun telah mereferensikannya... dan hidup tidak berjalan dengan baik... jika Anda menginginkan semuanya... Tapi itu adalah permulaan jika itu adalah jalan Anda ingin berjalan lebih jauh ke bawah.


Opsi Paling Sederhana

Namun jika Anda mengikuti Saran dari kru Razor Generator, dan benar-benar menginstal Razor Generator di atas Aplikasi Web MVC biasa (buat saja "perpustakaan" sebagai satu), maka hampir tidak ada pekerjaan ini yang diperlukan...

  1. Miliki situs MVC ASP.Net utama yang sebenarnya
  2. Buat situs MVC ASP.Net baru untuk bertindak sebagai "perpustakaan" Anda, sehingga Anda tidak perlu terlalu banyak dipusingkan
  3. Instal Paket Nuget untuk RazorGenerator.MVC ke "perpustakaan"
  4. Instal Paket Nuget untuk PrecompiledMvcViewEngineContrib ke "perpustakaan"
  5. Pindahkan tampilan ke struktur serupa di perpustakaan dan tandai sebagai Custom Tool RazorGenerator
  6. Referensikan "perpustakaan" Anda dari situs utama, dan semuanya akan bekerja lebih mudah dengan cara ini.

Keindahannya adalah "perpustakaan" yang Anda referensikan memiliki kode Mulai Aplikasi yang akan dijalankan pada awal aplikasi dari aplikasi utama Anda, dan itu akan mendaftarkan PreCompiledViewEngine, yang mengetahui tentang jalur virtual, dan bukan hanya jalur fisik. Kemudian tampilan Alat Kustom RazorGenerator Anda akan menentukan jalur virtualnya, dan ketika jalur tampilan diselesaikan, ia dapat menemukannya.


Referensi Bagus tentang topik: https://www.c-sharpcorner.com/UploadFile/97fc7a/article-precompiled-razor-view-using-razorgenerator-mvc-and/

person Greg    schedule 23.03.2019
comment
Jika Anda berada di jalur ini, mungkin tidak lama lagi Anda ingin mengaktifkan jenis halaman dasar Razor dengan satu atau lain cara. Tipe dasar halaman dapat diubah melalui web.config ‹pages pageBaseType=System.Web.Mvc.WebViewPage› haacked.com/archive/2011/02/21/ - person Greg; 23.03.2019