Отрисовка RazorPage в строку из RazorClassLibrary завершается неудачно при частичной отрисовке - PullRequest
0 голосов
/ 09 декабря 2018

Когда рендеринг 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.

1 Ответ

0 голосов
/ 09 декабря 2018

Обходной путь - использовать полный путь к частичной странице в файле RCL \ Areas \ Email \ Pages \ ConfirmEmail.cshtml.

От:

<partial name="_EmailButton" model="Model.ButtonModel"/>

Кому:

<partial name="/Areas/Email/Pages/Shared/_EmailButton.cshtml" model="Model.ButtonModel"/>
...