找不到参考项目中的视图

时间:2018-06-19 18:24:44

标签: asp.net-mvc razor asp.net-core razor-2 razorengine

我的解决方案包含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帮助器,也完全不支持本地化。

2 个答案:

答案 0 :(得分:0)

使用GetView()而不是FindView()解决了我的问题。

此外,本地化也被打破。自从在GitHub上查看Microsoft的代码以来,我不得不使用自己的IViewLocalizer实现,IViewLocalizer使用IHostingEnvironment中指定的程序集,该程序集设置为MyApp.Rest而不是MyApp.Core。

答案 1 :(得分:0)

您必须添加所有子文件夹路径

o.ViewLocationFormats.Add("/Views/RazorTemplates/{0}.cshtml");