剃刀引擎无法找到我在.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();
});
谢谢,我会试试! –
我试过了,它不起作用。仍然在_/Views/Myview.cshtml_和_/Views/Shared/Myview.cshtml_中查找'viewResult',但无法找到'Myview.cshtml',但是,我在_/Views/Shared/_中找到了'razorViewEngine '做了搜索! –
它应该工作,它确实对我有用。肯定会需要重建解决方案,以确保它重新编译和包含嵌入文件 –