.NET MVCで参照登録したDLLのビューを使用する方法

HAki 20 評価のポイント
2024-03-17T04:16:20.2533333+00:00

前回の質問後に、進展がありましたので、再度質問させて頂きます。

.NET8 MVC で、C#を使用しています。
クラスライブラリのプロジェクトでWebサイトに追加するPage01ページController、Model、Viewを作成しましたが、ControllerとModelは正しく機能するのですが、どうしてもViewだけが見つからないと言うエラーになってしまします。 そのような指定やコーディングを行えば、Viewは正しく機能してPage01は 表示できるようになるのでしょうか?

Page01.dllを参照するMVCサイトのプロジェクトは、
WebSampleと言う名で作成しています。

Page01.dllを作成するPage01と言うプロジェクトは、
/Controllers/Page01Controller.cs
/Model/Page01Models.cs
/View/Page01/index.cshtml
と言う3つのファイルで構成されています。

Page01Controller.csでは、
namespace Page01.Controllers { public class Page01Controller : Controller { public IActionResult Index() { Page01VM model = new(); return View(model); } } } と言うコーディングをしています。 Viewで /View/Page01/index.cshtml を指定しても Viewで指定を誤った時に表示される一般的な存在しない的なエラーが発生します。

2024/03/19 16時頃下記追加

いろいろなご回答ありがとうございます。 色々なご質問に関してご回答します。 本件は、.NET8 MVCでサイト構築を行っておりますが、作成するサイトのページ数軽く見積もっても100ページ以上のサイトであり、複数名での同時開発や開発時のデバック、初回リリース後に影響範囲と導入範囲を最小限にした修正導入等を考えたい点があります。そのため色々と調べて前回のご質問をさせていただきましたが、そもそも「.NET8 MVCには、DLLを参照登録するだけでコントローラーなどが簡単に追加される機能があると言う事がわかりました。」そこで、回答が無い点がありましたので、ご質問を今回のご質問に変更させて頂きました。 こちらのご質問の方が、.NET8 MVCではDLLからコントローラーなどを簡単に追加できる仕組みがある関係から問題可決に繋がりやすく、少しでも先に進めると考えております。

http://サイト/Page01 のURLにアクセスした時、DLLのコントローラーに処理が入り、Viewまで処理は進み、その後下記エラーが発生します。Page01用DLLのクラスライブラリのプロジェクト構成とコントローラーのソースは本件で質問させて頂いた通りとなります。

`An unhandled exception occurred while processing the request. InvalidOperationException: The view 'Index' was not found. The following locations were searched: /Views/Page01/Index.cshtml /Views/Shared/Index.cshtml

Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable<string> originalLocations) InvalidOperationException: The view 'Index' was not found. The following locations were searched: /Views/Page01/Index.cshtml /Views/Shared/Index.cshtml

Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable<string> originalLocations)
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0<TFilter, TFilterAsync>(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext<TFilter, TFilterAsync>(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)

本件の問題が解決できた後、サイトのprogram.csでサイト起動時に動的に特定ディレクトリに存在するDLLを登録させる方法の検討に進もうと考えております。

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
28 件の質問
{count} 件の投票

承認済みの回答
  1. SurferOnWww 1,911 評価のポイント
    2024-03-19T06:47:28.9233333+00:00

    クラスライブラリのプロジェクトでWebサイトに追加するPage01ページController、Model、Viewを作成しましたが

    その「クラスライブラリのプロジェクト」というのは ASP.NET Core MVC 本体とは全く別の独立したプロジェクトということのようですが、なぜ、普通のやり方すなわち、ASP.NET Core MVC 本体のプロジェクトに Controller, Model, View を追加しないのですか? そうすれば質問に書いてあるすべての悩みは解消できますけど。

    ASP.NET Core MVC の cshtml ファイルはデフォルトでビルド時及びデプロイ時に dll にコンパイルされるそうなので、

    ASP.NET Core での Razor ファイルのコンパイル

    .NET Framework 版の MVC のようなランタイムコンパイルだからダメということはなさそうですが、ビューの検出のルールがあって、

    ビューの検出

    そのルールに従わないとビューが見つからないという結果になるのではないかと思われます。

    そこを何とかしてライブラリのビュー見つけて使うようにする方法は残念ながら自分は見つけられません。

    どうしても独立したライブラリを使わなければならない事情があるなら、Razor Class Library として作ることを考えてはいかがですか?

    ASP.NET Core の Razor クラス ライブラリ プロジェクトを使用した再利用可能 UI の作成

    Working with Razor Class Libraries in ASP.NET Core

    後者の記事の方が分かりやすいと思います。それによると、"RCLs can also include MVC controllers and Views, and API controllers." とのことです (未検証・未確認です)。


2 件の追加の回答

並べ替え方法: 最も役に立つ
  1. HAki 20 評価のポイント
    2024-03-19T07:26:44.4966667+00:00

    いろいろなご回答ありがとうございます。 色々なご質問に関してご回答します。
    本件は、.NET8 MVCでサイト構築を行っておりますが、作成するサイトのページ数軽く見積もっても100ページ以上のサイトであり、複数名での同時開発や開発時のデバック、初回リリース後に影響範囲と導入範囲を最小限にした修正導入等を考えたい点があります。そのため色々と調べて前回のご質問をさせていただきましたが、そもそも「.NET8 MVCには、DLLを参照登録するだけでコントローラーなどが簡単に追加される機能があると言う事がわかりました。」そこで、回答が無い点がありましたので、ご質問を今回のご質問に変更させて頂きました。
    こちらのご質問の方が、.NET8 MVCではDLLからコントローラーなどを簡単に追加できる仕組みがある関係から問題可決に繋がりやすく、少しでも先に進めると考えております。

    http://サイト/Page01 のURLにアクセスした時、DLLのコントローラーに処理が入り、Viewまで処理は進み、その後下記エラーが発生します。Page01用DLLのクラスライブラリのプロジェクト構成とコントローラーのソースは本件で質問させて頂いた通りとなります。

    `An unhandled exception occurred while processing the request. InvalidOperationException: The view 'Index' was not found. The following locations were searched: /Views/Page01/Index.cshtml /Views/Shared/Index.cshtml

    Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable<string> originalLocations) InvalidOperationException: The view 'Index' was not found. The following locations were searched: /Views/Page01/Index.cshtml /Views/Shared/Index.cshtml

    Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable<string> originalLocations)
    Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
    Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|30_0<TFilter, TFilterAsync>(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext<TFilter, TFilterAsync>(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
    Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
    Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
    Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
    

    本件の問題が解決できた後、サイトのprogram.csでサイト起動時に動的に特定ディレクトリに存在するDLLを登録させる方法の検討に進もうと考えております。


  2. HAki 20 評価のポイント
    2024-03-19T15:03:38.0233333+00:00

    本件解決しました。
    プロジェクトファイルの1行名がMicrosoft.NET.Sdkの指定になっていたのを
    Microsoft.NET.Sdk.Webに変更してコンパイルしてMVCサイト側に参照登録したら問題無くViewも参照されました。MVCサイト側もDLL側も下記以外は質問時から変更はありません。

    <Project Sdk="Microsoft.NET.Sdk.Web">
    
      <PropertyGroup Label="Globals">
        <SccProjectName>SAK</SccProjectName>
        <SccProvider>SAK</SccProvider>
        <SccAuxPath>SAK</SccAuxPath>
        <SccLocalPath>SAK</SccLocalPath>
      </PropertyGroup>
    
      <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
        <Nullable>enable</Nullable>
        <ImplicitUsings>enable</ImplicitUsings>
        <OutputType>Library</OutputType>
      </PropertyGroup>
    
    </Project>