我的解决方案包含2个项目:
Core使用Razor模板生成电子邮件和报告。 Rest仅是WebAPI,并引用Core。 Rest具有启动文件,在该文件中进行Razor配置。将来,Core也将被其他项目使用。
问题是,即使我已将输出目录添加为剃须刀的FileProvider,并且模板已复制到输出目录,我仍无法使视图引擎定位视图文件。
输出目录:
MyApp.Code.dll
MyApp.Rest.dll
RazorTemplates
-> Template1.cshtml
Startup.cs
services.AddMvc()
.AddApplicationPart(typeof(MyApp.Core.RazorViewRenderer).GetTypeInfo().Assembly)
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
services.Configure<RazorViewEngineOptions>(o => {
o.ViewLocationFormats.Add("/RazorTemplates/{0}" + RazorViewEngine.ViewExtension);
o.FileProviders.Add(new PhysicalFileProvider(AppContext.BaseDirectory));
});
RazorViewRenderer.cs:
public async Task<string> RenderAsync<TModel>(string name, TModel model) {
var actionContext = GetDefaultActionContext();
var viewEngineResult = _viewEngine.FindView(actionContext, "Template1", true);
if (!viewEngineResult.Success) {
throw new InvalidOperationException($"View '{name}' cannot be found."); //Craches here.
}
var view = viewEngineResult.View;
using (var output = new StringWriter()) {
var viewContext = new ViewContext(actionContext, view,
new ViewDataDictionary<TModel>(
metadataProvider: new EmptyModelMetadataProvider(),
modelState: new ModelStateDictionary()) {
Model = model
},
new TempDataDictionary(
actionContext.HttpContext,
_tempDataProvider),
output,
new HtmlHelperOptions());
await view.RenderAsync(viewContext);
return output.ToString();
}
}
注意:不能选择RazorLight。它不支持HTML帮助器,也完全不支持本地化。
答案 0 :(得分:0)
使用GetView()而不是FindView()解决了我的问题。
此外,本地化也被打破。自从在GitHub上查看Microsoft的代码以来,我不得不使用自己的IViewLocalizer实现,IViewLocalizer使用IHostingEnvironment中指定的程序集,该程序集设置为MyApp.Rest而不是MyApp.Core。
答案 1 :(得分:0)
您必须添加所有子文件夹路径
o.ViewLocationFormats.Add("/Views/RazorTemplates/{0}.cshtml");