2016-07-12 2 views
2

で知られていないViewComponentを使用した:私はのためのアプリケーションの一部を持っている私は新しいASP.Net MVCのコアプロジェクトを始めていると私は、私は次の操作を行うことができる方法を把握しようとしているコンパイル時

私はコンパイル時に知られていない "プラグイン"を追加できるようにしたい。私は、外部ソースから来ることができる "コンポーネント"を追加したいページがあります。

たとえば、私は基本的な情報を持つページを持っています。私が家の販売ソフトウェアを作っているとしよう。私はすべてについて同じ住宅に関する基本情報を持っていますが、既存のプラグインやその他の情報に応じて、コンパイル時には必ずしも知られていないコンポーネントをページに表示するドロップダウンリストがあります。

ViewComponentsを見てきましたが、Partial Viewsと似ているようですが、InvokeAsyncを使用すると、コンパイル時に知っている必要があるようです。

さらに、これらのViewComponentのデータをどのように保存しますか?

答えて

3

ビューコンポーネントはコンパイル時に知る必要はありません。実行時にそれらを参照することはできますが、いくつかのトリックがあります。まず、クラスライブラリ内のファイルcshtmlを埋め込みリソースとして含める必要があります。これは、クラスライブラリのproject.jsonに以下を追加することによって行うことができますあなたのWebアプリのStartup.ConfigureServices方法で

"buildOptions": { 
    "embed": "Views/**/*.cshtml" 
} 

、あなたはRazorViewEngineOptionsに埋め込まれたファイルプロバイダを追加する必要があります。ここでは、既知のアセンブリでこれを行う例を示します。あなたのケースでは

//Get a reference to the assembly that contains the view components 
var assembly = typeof(ViewComponentLibrary.ViewComponents.SimpleViewComponent).GetTypeInfo().Assembly; 

//Create an EmbeddedFileProvider for that assembly 
var embeddedFileProvider = new EmbeddedFileProvider(
    assembly, 
    "ViewComponentLibrary" 
); 

//Add the file provider to the Razor view engine 
services.Configure<RazorViewEngineOptions>(options => 
{     
    options.FileProviders.Add(embeddedFileProvider); 
}); 

あなたのプラグインディレクトリで見つかった各アセンブリのためAssemblyLoadContext.Default.LoadFromAssemblyPathを使用して行うことができ、動的にそれらのアセンブリをロードする必要があります。

アプリケーションと特定のユースケースについてもっと知らなくても、ビューコンポーネントのデータをどのように保存するかという質問に答えることは難しいです。

ここでは、ブログの投稿のビューコンポーネントを使用するプロセスを、http://www.davepaquette.com/archive/2016/07/16/loading-view-components-from-a-class-library-in-asp-net-core.aspx

と概説しました。
関連する問題