2017-06-19 1 views
2

私はViewRenderServiceクラスで構成され、私のクラスライブラリ、持っている:カミソリエンジンは、.NETのコアクラスライブラリの私の見解を見つけることができません

public interface IViewRenderService 
    { 
     Task<string> RenderToStringAsync(string viewName, object model); 
    } 

    public class ViewRenderService : IViewRenderService 
    { 
     private readonly IRazorViewEngine _razorViewEngine; 
     private readonly ITempDataProvider _tempDataProvider; 
     private readonly IServiceProvider _serviceProvider; 

     public ViewRenderService(IRazorViewEngine razorViewEngine, 
      ITempDataProvider tempDataProvider, 
      IServiceProvider serviceProvider) 
     { 
      _razorViewEngine = razorViewEngine; 
      _tempDataProvider = tempDataProvider; 
      _serviceProvider = serviceProvider; 
     } 

     public async Task<string> RenderToStringAsync(string viewName, object model) 
     { 
      var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider }; 
      var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); 

      using (var sw = new StringWriter()) 
      { 
       var viewResult = _razorViewEngine.FindView(actionContext, viewName, false); 

       if (viewResult.View == null) 
       { 
        throw new ArgumentNullException($"{viewName} does not match any available view"); 
       } 

       var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) 
       { 
        Model = model 
       }; 

       var viewContext = new ViewContext(
        actionContext, 
        viewResult.View, 
        viewDictionary, 
        new TempDataDictionary(actionContext.HttpContext, _tempDataProvider), 
        sw, 
        new HtmlHelperOptions() 
       ); 

       await viewResult.View.RenderAsync(viewContext); 
       return sw.ToString(); 
      } 
     } 

とパスからスタートビューの多くを:私クラスライブラリのルート/ Views // Shared/many views

問題は、IRazorViewEngineは私の意見を見つけることができません。例えばviewRenderService.RenderToStringAsync(?)~/Views/Shared/Myview.cshtmlと呼ぶべきですか?

答えて

2

私はクラスライブラリのビューを処理する方法は、すなわち私が

<ItemGroup> 
    <EmbeddedResource Include="Views\**" Exclude="bin\**;obj\**;**\*.xproj;packages\**;@(EmbeddedResource)" /> 
</ItemGroup> 

を持っている、あなたは、このパッケージを必要と.csprojファイルに、リソース埋め込みビューを作ることです。

<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="1.1.*" /> 

、その後、私は、このようなクラスライブラリに拡張メソッドを持っています:

public static RazorViewEngineOptions AddCloudscribeSimpleContentBootstrap3Views(this RazorViewEngineOptions options) 
{ 
    options.FileProviders.Add(new EmbeddedFileProvider(
     typeof(Bootstrap3).GetTypeInfo().Assembly, 
     "cloudscribe.SimpleContent.Web.Views.Bootstrap3" 
    )); 

    return options; 
} 

そしてmaのStartup.csこれらのビューには次のような拡張方法を使用するようにオプトインする必要があります。

services.AddMvc() 
.AddRazorOptions(options => 
{ 
    options.AddCloudscribeSimpleContentBootstrap3Views(); 
}); 
+0

ありがとう、私はそれを試してみましょう! –

+0

私は試しましたが、動作しません。それでも、 'viewResult'は_/Views/Myview.cshtml_と_/Views/Shared/Myview.cshtml_を検索して、Myview.cshtmlを見つけることができませんが、_/Views/Shared/_には' razorViewEngine '検索しました! –

+0

それは動作するはずです、それは私のために働く。組み込みファイルを再コンパイルしてインクルードすることを確実にするための再構築ソリューションが必要です。 –

関連する問題