【问题标题】:MVC 4 - Use Razor Views in Class LibraryMVC 4 - 在类库中使用 Razor 视图
【发布时间】:2012-09-14 21:24:34
【问题描述】:

我正在尝试在类库项目中使用 MVC 4 Razor 视图。

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

有人知道我错过了什么吗?

谢谢,

米格尔

【问题讨论】:

  • 你试图在类库中运行视图是什么意思?这没有意义 - 我认为您的问题/目标不是很明确。

标签: asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

您的项目必须是 Web 应用程序,智能感知才能正常工作。 Web Application 只是一个特殊的类库。

【讨论】:

    【解决方案2】:

    事实证明,简单的解决方案是将其创建为 Web 应用程序,但这可能并不适合所有人。

    第一次尝试

    我自己也有一个类库,我想在其中创建一些控件,但我想拥有一个工作的 Razor View,并具有全智能支持。诀窍是:

    1. 添加引用(用于 MVC)
    2. 在 ProjectGUID 之后将 ProjectTypeGuids 添加到 .csproj(编辑为文本):&lt;ProjectTypeGuids&gt;{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}&lt;/ProjectTypeGuids&gt;
    3. 添加一个 .cshtml razor view 文件(直到下一部分才会正常工作)
    4. 添加 Web.Config 文件(查看您的查看文件夹 web.config)
    5. Project Properties Build输出路径更改为bin\(不是bin\Debug
    6. 清理和构建解决方案

    让你快到了(cmets 提到了 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 ,但仍然在这里,您可能不想将您的项目创建为类库,因为这样不好玩......

    1. 为 Razor Generator 安装 VS 扩展
    2. 添加新的类库项目
    3. 将 NuGet 包添加到 RazorGenerator.Mvc 的库中
    4. PrecompiledMvc​​ViewEngineContrib 将 NuGet 包添加到您的库中
    5. 创建一个 Views 文件夹和一个 controller named 文件夹在你的库中为你希望它们访问的虚拟路径
    6. 移动任何视图到新的\Views\ControllerName\文件夹
    7. 将所有这些库视图设置为 Custom Tool RazorGenerator(右键单击视图属性)
    8. 从您的真实 ASP.Net MVC Web 应用程序添加参考到您的

    从那里我经常有问题。除非我添加 Microsoft.CodeDom.Providers.DotNetCompilerPlatform nuget 包,否则我将被困在 C# 2.0 中。这是 4.5,所以对于 4.6.x,可以将 app.config 中的新 codedom 部分修改为

      <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 团队的建议,并在常规 MVC Web 应用程序之上实际安装 Razor Generator(只需创建您的“图书馆”作为一个),那么几乎不需要这些工作......

    1. 拥有一个主要的真实 MVC ASP.Net 站点
    2. 创建一个新的 MVC ASP.Net 站点来充当您的“库”,这样您就不必把事情搞砸了
    3. 将 RazorGenerator.MVC 的 Nuget 包安装到“库”
    4. 将 PrecompiledMvc​​ViewEngineContrib 的 Nuget 包安装到“库”
    5. 将视图移动到库中的类似结构并标记为自定义工具 RazorGenerator
    6. 从主站点引用您的“库”,这样就可以更轻松地完成所有工作。

    美妙之处在于,您引用的“库”具有应用启动代码,该代码将在您的主应用的应用启动时运行,并且将注册 PreCompiledViewEngine,它知道虚拟路径,而不仅仅是物理路径。然后你的 RazorGenerator Custom Tool 视图会定义它们的虚拟路径,当视图路径被解析时,它可以找到它们。


    关于该主题的不错参考: https://www.c-sharpcorner.com/UploadFile/97fc7a/article-precompiled-razor-view-using-razorgenerator-mvc-and/

    【讨论】:

    • 如果您走这条路,可能不久之后您就会想以一种或另一种方式启用 Razor 基本页面类型。可以通过 web.config haacked.com/archive/2011/02/21/… 更改页面基类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    相关资源
    最近更新 更多