在我的控制器中使用其他类库中的视图

时间:2019-02-06 12:52:09

标签: c# asp.net-core asp.net-core-mvc

假设我有一个名为Controllers的类库和另一个名为Views的类库

Views里面有我的.cshtml文件,在Controller中有我的.cs

我如何“说服”我的控制器使用来自名为Views的项目/类库中的Views

项目结构:

|
|
|-- MyViews
        |
        |-- MyTestView.cshtml
        |-- Shared
                |
                |-- shared.cshtml
|-- Controllers
|-- AppRunner (Program Main, Startup.cs)

我尝试过

// {2} is area, {1} is controller,{0} is the action    

services.Configure<RazorViewEngineOptions>(o =>
{
    o.ViewLocationFormats.Clear(); 
    o.ViewLocationFormats.Add("/MyViews/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("/MyViews/Shared/{0}" + RazorViewEngine.ViewExtension);
}

services.Configure<RazorViewEngineOptions>(o =>
{
    o.ViewLocationFormats.Clear(); 
    o.ViewLocationFormats.Add("~/MyViews/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("~/MyViews/Shared/{0}" + RazorViewEngine.ViewExtension);
}

services.Configure<RazorViewEngineOptions>(o =>
{
    o.ViewLocationFormats.Clear(); 
    o.ViewLocationFormats.Add("/../MyViews/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("/../MyViews/Shared/{0}" + RazorViewEngine.ViewExtension);
}

但是所有这些返回的错误都无法在这些位置找到cshtml文件

1 个答案:

答案 0 :(得分:0)

主Web应用程序中的视图将始终覆盖类库中的视图。但是,当然可以从与控制器不同的类库中使用视图。

为了在视图类库中发现视图,您的视图类库必须使用sdk Microsoft.NET.Sdk.Razor,并且必须直接依赖于Microsoft.AspNetCore.Mvc

否则,它将不会在类库中看到视图。

并且主要的Web应用程序必须引用类库。

您不需要该视图位置扩展器逻辑。

更新:

您的views项目csproj应该看起来像这样:

<Project Sdk="Microsoft.NET.Sdk.Razor">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="path-to-yourview-models-project.csproj" />
      --maybe other project refs here
  </ItemGroup>
</Project>

请注意,Microsoft.NET.Sdk.Razor不是程序包依赖项。

类库中的视图也需要与主Web应用程序中的视图相同的文件夹结构约定。

 Views
   Home
      .cshtml files
   Shared
      .cshtml files
   _ViewImports.cshtml

您可以将它们放在与控制器名称相对应的文件夹中,而不带“ Controller”后缀,也可以将它们全部共享。