首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.net核心:模型在将页面呈现为字符串时为空

ASP.net核心:模型在将页面呈现为字符串时为空
EN

Stack Overflow用户
提问于 2021-08-05 16:15:33
回答 1查看 804关注 0票数 1

我想呈现一个页面作为电子邮件模板。

但是当渲染器想要使用模型时,我得到了一个错误。

我遵循本教程:learnrazorpages.com

RazorRenderer.cs:

代码语言:javascript
复制
public class RazorRenderer : IRazorRenderer
{
    private readonly IRazorViewEngine _viewEngine;
    private readonly ITempDataProvider _tempDataProvider;
    private readonly IServiceProvider _serviceProvider;

    public RazorRenderer(
        IRazorViewEngine viewEngine,
        ITempDataProvider tempDataProvider,
        IServiceProvider serviceProvider)
    {
        _viewEngine = viewEngine;
        _tempDataProvider = tempDataProvider;
        _serviceProvider = serviceProvider;
    }

    public async Task<string> ToStringAsync<TModel>(string partialName, TModel model)
    {
        var actionContext = GetActionContext();
        var partial = FindView(actionContext, partialName);
        var viewData = new ViewDataDictionary<TModel>(new EmptyModelMetadataProvider(), new ModelStateDictionary());
        var tempData = new TempDataDictionary(actionContext.HttpContext, _tempDataProvider);

        viewData.Model = model;

        await using var stringWriter = new StringWriter();

        var viewContext = new ViewContext(
            actionContext,
            partial,
            viewData,
            tempData,
            stringWriter,
            new HtmlHelperOptions()
        );

        await partial.RenderAsync(viewContext);

        return stringWriter.ToString();
    }

    private IView FindView(ActionContext actionContext, string partialName)
    {
        var getPartialResult = _viewEngine.GetView(null, partialName, false);

        if (getPartialResult.Success)
        {
            return getPartialResult.View;
        }

        var findPartialResult = _viewEngine.FindView(actionContext, partialName, false);

        if (findPartialResult.Success)
        {
            return findPartialResult.View;
        }

        var searchedLocations = getPartialResult.SearchedLocations.Concat(findPartialResult.SearchedLocations);
        var errorMessage = string.Join(
            Environment.NewLine,
            new[]
            {
                $"Unable to find partial '{partialName}'. The following locations were searched:"
            }.Concat(searchedLocations));

        throw new InvalidOperationException(errorMessage);
    }

    private ActionContext GetActionContext()
    {
        var httpContext = new DefaultHttpContext
        {
            RequestServices = _serviceProvider
        };

        return new ActionContext(httpContext, new RouteData(), new ActionDescriptor());
    }
}

Test.cs:

代码语言:javascript
复制
public class TestModel : PageModel
{
    private readonly IRazorRenderer _razorRenderer;

    public RecoveryModel(IRazorRenderer razorRenderer)
    {
        _razorRenderer = razorRenderer;
    }

    public void OnGet()
    {
    }

    public async Task<IActionResult> OnPost()
    {
        var body = await _razorRenderer.ToStringAsync(
            "Email",
            new Test
            {
                Email = "Email@Test.com"
            });

        return Content(body);
    }
}

Email.cshtml.cs

代码语言:javascript
复制
public class EmailModel : PageModel
{
    public string Email { get; set; }

    public void OnGet()
    {
    }
}

Email.cshtml:

代码语言:javascript
复制
@page
@model EmailModel
@{
    Layout = null;
}
@Model.Email // Here I get the exception (Model is null)

我在哪里做错了事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-06 03:10:03

我在哪里做错了事?

您需要创建一个部分视图,它是一个剃须刀视图,而不是剃须刀页面

Email.cshtml:

代码语言:javascript
复制
@model Test
@{
    Layout = null;
}
@Model.Email

型号:

代码语言:javascript
复制
public class Test
{ 
    public string Email { get; set; }
}

TestModel:

代码语言:javascript
复制
public async Task<IActionResult> OnPost()
{
    var body = await _razorRenderer.ToStringAsync(
        "Email",
        new Test
        {
            Email = "Email@Test.com"
        });

    return Content(body);
}

结果:

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68670141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档