Мое решение состоит из 2 проектов:
- MyApp.Rest
- MyApp.Core
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 и вообще не поддерживает локализацию.