剃刀引擎无法找到我在.net核心类库视图

问题描述:

我有我的类库,它由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(); 
      } 
     } 

和大量的意见,这从路径开始:我类库root/Views //共享/许多视图

问题是,那IRazorViewEngine找不到我的意见,我应该怎么称呼viewRenderService.RenderToStringAsync(?)来渲染~/Views/Shared/Myview.cshtml,例如?

我在类库处理意见的方式是使意见嵌入的资源,即在.csproj的文件我有

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

,你需要这个包:

<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; 
} 

然后在Startup.cs中的ma在应用程序中,您必须选择使用如下扩展方法来包含这些视图:

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

谢谢,我会试试! –

+0

我试过了,它不起作用。仍然在_/Views/Myview.cshtml_和_/Views/Shared/Myview.cshtml_中查找'viewResult',但无法找到'Myview.cshtml',但是,我在_/Views/Shared/_中找到了'razorViewEngine '做了搜索! –

+0

它应该工作,它确实对我有用。肯定会需要重建解决方案,以确保它重新编译和包含嵌入文件 –