Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在我的控制器中使用来自其他类库的视图_C#_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

C# 在我的控制器中使用来自其他类库的视图

C# 在我的控制器中使用来自其他类库的视图,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,假设我有一个名为Controllers的类库和另一个名为Views 在视图中有我的.cshtml文件,在控制器中有我的.cs 如何“说服”我的控制器使用名为视图的项目/类库中的视图 项目结构: | | |-- MyViews | |-- MyTestView.cshtml |-- Shared | |-- shared.cshtml |-- Controllers |-- AppRun

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

视图中
有我的
.cshtml
文件,在控制器中有我的
.cs

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

项目结构:

|
|
|-- 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);
}
/{2}是区域,{1}是控制器,{0}是动作
服务配置(o=>
{
o、 ViewLocationFormats.Clear();
o、 添加(“/MyViews/{1}/{0}”+RazorViewEngine.ViewExtension);
o、 添加(“/MyViews/Shared/{0}”+RazorViewEngine.ViewExtension);
}

services.Configure(o=>
{
o、 ViewLocationFormats.Clear();
o、 添加(“~/MyViews/{1}/{0}”+RazorViewEngine.ViewExtension);
o、 添加(“~/MyViews/Shared/{0}”+RazorViewEngine.ViewExtension);
}

services.Configure(o=>
{
o、 ViewLocationFormats.Clear();
o、 添加(“/../MyViews/{1}/{0}”+RazorViewEngine.ViewExtension);
o、 添加(“/../MyViews/Shared/{0}”+RazorViewEngine.ViewExtension);
}

但是它们都返回一个错误,即在这些位置找不到cshtml文件。主web应用程序中的视图将始终覆盖类库中的视图。但是视图肯定可以从不同于控制器的类库中使用

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

否则,它将看不到类库中的视图

主web应用程序必须引用类库

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

更新:

您的视图项目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>

您可以将它们放在与控制器名称对应的文件夹中,而不使用“controller”后缀,或者您可以将它们全部放在共享的

中,是什么阻止您将视图放在同一个项目和程序集中?MyViews项目是否直接位于解决方案下?因为您需要一个完整的路径,从AppRunner开始。如何
~/../MyViews…
?@AliEzzatOdeh没有,但是分隔使其更容易实现控制整个项目的发展。@HenkHolterman
MyViews
AppRunner
处于同一级别。我将尝试
~/../../
MyAppRunner:
//因为我需要注册程序集
控制器:
但仍然
无效异常:未找到视图“Login”。搜索了以下位置:/Views/Home/Login.cshtml/Views/Shared/Login.cshtml/Pages/Shared/Login.cshtml
services.Configure<RazorViewEngineOptions>(o =>
{
    o.ViewLocationFormats.Clear(); 
    o.ViewLocationFormats.Add("/../MyViews/{1}/{0}" + RazorViewEngine.ViewExtension);
    o.ViewLocationFormats.Add("/../MyViews/Shared/{0}" + RazorViewEngine.ViewExtension);
}
<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>
 Views
   Home
      .cshtml files
   Shared
      .cshtml files
   _ViewImports.cshtml