MVC 4 - 在类库中使用Razor视图

问题描述 投票:3回答:3

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

我将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
3个回答
1
投票

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


0
投票

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

第一次尝试

我自己也有一个类库,我想创建一些控件,但我想要一个工作的Razor View,并提供全面的智能支持。诀窍是:

  1. 添加引用(适用于MVC)
  2. 在ProjectGUID:<ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>之后将ProjectTypeGuids添加到.csproj(编辑为文本)
  3. 添加一个.cshtml剃刀视图文件(它不会正常工作,直到下一个部分)
  4. 添加Web.Config文件(请参阅View文件夹web.config)
  5. 更改项目属性构建输出路径到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,但即使仍然在这里,您可能也不希望将项目创建为一个类库,因为这样不好玩......

  1. 为Razor Generator安装VS Extension
  2. 添加新的类库项目
  3. 将NuGet包添加到您的库中以获取RazorGenerator.Mvc
  4. 将NuGet包添加到库中以进行PrecompiledMvc​​ViewEngineContrib
  5. 在库中创建一个Views文件夹和一个名为folder的控制器,用于访问这些文件夹
  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中的新编码部分修改为

  <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. 将视图移动到库中的类似结构并标记为Custom Tool RazorGenerator
  6. 从主站点引用您的“库”,这样一切都可以通过这种方式减少麻烦。

美妙的是,您引用的“库”具有App Start代码,该代码将在主应用程序的应用程序启动时运行,并且将注册PreCompiledViewEngine,它知道虚拟路径,而不仅仅是物理路径。然后,您的RazorGenerator自定义工具视图将定义其虚拟路径,并且在解析视图路径时,它可以找到它们。


关于这个主题的很好的参考:https://www.c-sharpcorner.com/UploadFile/97fc7a/article-precompiled-razor-view-using-razorgenerator-mvc-and/

© www.soinside.com 2019 - 2024. All rights reserved.