Когда рендеринг RazorPage в ASP.NET Core 2.2 работает отлично, пока я не добавляю частичный тег, который прекрасно работает, когда я открываю его в браузере, но завершается ошибкой, когда я вызываю его с помощью RazorPageToStringRenderer со следующей ошибкой:
InvalidOperationException: The partial view '_EmailButton' was not found. The following locations were searched:
/Views/Home/_EmailButton.cshtml
/Views/Shared/_EmailButton.cshtml
/Pages/Shared/_EmailButton.cshtml
Вот мой RazorPageToStringRenderer:
public async Task<string> RenderToStringAsync<T>(string pageName, T model) where T : PageModel
{
var context = new ActionContext(
httpContext.HttpContext,
httpContext.HttpContext.GetRouteData(),
actionContext.ActionContext.ActionDescriptor
);
using (var sw = new StringWriter())
{
var result = razorViewEngine.GetPage(null, pageName);
if (result.Page == null)
throw new ArgumentNullException($"The page {pageName} cannot be found.");
var view = new RazorView(razorViewEngine,
activator,
new List<IRazorPage>(),
result.Page,
HtmlEncoder.Default,
new DiagnosticListener("ViewRenderService"));
var viewContext = new ViewContext(
context,
view,
new ViewDataDictionary<T>(new EmptyModelMetadataProvider(), new ModelStateDictionary())
{
Model = model
},
new TempDataDictionary(
httpContext.HttpContext,
tempDataProvider
),
sw,
new HtmlHelperOptions()
);
viewContext.ExecutingFilePath = pageName;
var page = (Page) result.Page;
page.PageContext = new PageContext
{
ViewData = viewContext.ViewData
};
page.ViewContext = viewContext;
activator.Activate(page, viewContext);
await page.ExecuteAsync();
return sw.ToString();
}
}
Ключевой частью проблемы является тот факт, что мой RazorPage находится в RazorClassLibrary, и его путь - Areas / Email / Pages / ConfirmEmail.cshtml.У меня там тоже есть файл ViewImports.cshtml, но я не думаю, что он загружается правильно.
Я пытался установить свойство ExecutingFilePath в ViewContext, но это не имело никакого значения.
Факты: Страница: RCL \ Areas \ Email \ Pages \ ConfirmEmail.cshtml Я отображаю частичную страницу, используя эту строку:
<partial name="_EmailButton" model="Model.ButtonModel"/>
Частично: RCL \ Areas \ Email \ Pages \ Shared_EmailButton.cshtml
Я отправил пример проекта, который воспроизводит проблему здесь: https://github.com/paulcsiki/TestRCLToString.