Не удается найти представление, расположенное в указанном проекте

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


person olivierr91    schedule 19.06.2018    source источник


Ответы (2)


Решил мою проблему, используя GetView() вместо FindView().

Также была нарушена локализация. Мне пришлось использовать свою собственную реализацию IViewLocalizer, поскольку, глядя на код Microsoft на GitHub, IViewLocalizer использует сборку, указанную в IHostingEnvironment, для которой было установлено значение MyApp.Rest вместо MyApp.Core.

person olivierr91    schedule 19.06.2018

Вы должны добавить все пути к дочерней папке

o.ViewLocationFormats.Add("/Views/RazorTemplates/{0}.cshtml");
person Ramesh Malviya    schedule 20.06.2018