2017-02-17 5 views
2

私の意見の大半は通常の/Views/<Controller>フォルダ階層の<action>.cshtmlファイルです。これらはgitでソース制御され、通常の "rip and replace"の方法で展開されます。では、プロジェクトフォルダの外からViewフォルダを追加できますか?

ただし、私はRazorを使用してHTMLテンプレートを作成し、電子メールの.cshtmlテンプレートは各クライアントに固有です。したがって、外部のからApplication Rootフォルダをロードしてレンダリングできるようにするため、展開時にクライアント固有のカスタマイズが失われることはありません。

私は正常に作成され、 IViewLocationExpanderインタフェースの実装を登録し、これはアプリケーションのルート内のフォルダで動作している

public class EmailViewLocationExpander : IViewLocationExpander 
{ 
    protected readonly String _TemplateFolder; 

    public EmailViewLocationExpander(String TemplateFolder) 
    { 
     _TemplateFolder = TemplateFolder.Trim('/'); 
    } 

    public void PopulateValues(ViewLocationExpanderContext context) 
    { 
    } 

    public IEnumerable<string> ExpandViewLocations(ViewLocationExpanderContext context, IEnumerable<string> viewLocations) 
    { 
     var result = new List<String>(viewLocations); 

     result.Add($"/{ _TemplateFolder }/Email/{{0}}.cshtml"); 
     result.Add($"/{ _TemplateFolder }/Shared/{{0}}.cshtml"); 

     return result; 
    } 
} 

とても例えば、アプリケーションルート相対以外のパスのために動作するようには思えません/../Templatesは動作していないようです。

私はまた、現在、私の電子メールテンプレートのカスタム_ViewStart.cshtmlを持つに依存している、とMvc source codeを読んだことは、私の唯一のオプションは、現在のアプリケーションルート外の物理ファイルシステムを参照するために、カスタムIFileProviderを実装することであると思うように私をリード - ということですそうであれば誰でも私に例を教えてもらえますか?

答えて

1

それは私にとって正しいようです。 ViewLocationExpanderは、wwwrootフォルダに関連するパスを扱うので、それ以外のファイルへのパスを指定すると便利ではありません。

ここには、IFileProviderの実装に関するかなり良い記事があります。これらの記事では、データベースに格納されたビューにアクセスするための作成とIFileProviderが示されていますが、ファイルシステムから読み取ることはさらに簡単になります。それは何を考慮すべきかの大きな概要です。 https://www.mikesdotnetting.com/article/301/loading-asp-net-core-mvc-views-from-a-database-or-other-location

私が指摘した事は、IFileProviderの仕方がかなりクールだということです。以下のようにカスタム実装をオプションとしてRazorViewEngineに登録します.ViewEngineがファイルを取得する必要があるときは、FileProviderに、そのファイルが返されるまで順番にそのファイルを尋ねます。

public void ConfigureServices(IServiceCollection services) 
{ 
    string customLocation = @"c:\mylocation\" 

    // Add framework services. 
    services.AddMvc(); 
    services.Configure<RazorViewEngineOptions>(opts => 
     opts.FileProviders.Add(
      new MyCustomFileProvider(customLocation) 
     ) 
    ); 
} 

だから、最後に、あなたは基本的には、いくつかの特定のURLエンドポイント用のファイルを提供するために、あなたのFileProviderを実装します。あなたは好きな場所からそれらを得ることができます。

+1

私は古いファイルを読んでいましたが、これはMvcが1つのファイルプロバイダしか受け付けないことを示していました。だから、CompositeFileProvider(これは.NETコアのものです)を探していて、単一のIFileProviderですが、(私はv1.1を使用しています)それは確かにIList であり、あなたが説明するように簡単に実装でき、魅力的に機能します。ありがとう。 \t services.Configure ( \t \t OPTS => \t \t { \t \t \t opts.FileProviders: –

+1

私の場合、私は私の別の場所のための別のPhysicalFileProviderを作成しました。追加( \t \t \t \t新しいPhysicalFileProvider(パス) \t \t \t) \t \t} \t); –

関連する問題