将值分配给PageFilter中的ViewData时出错

时间:2019-07-12 10:25:37

标签: c# asp.net-core razor-pages asp.net-core-2.2

我正在使用PageFilter,可以在每个页面上调用以获取_Layout页面的一些数据:

public class GetEventFilter : IAsyncPageFilter
{
    private readonly DBContext _context;

    public GetEventFilter(DBContext context)
    {
        _context = context;
    }

    public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
    {

        if (context.HandlerInstance is PageModel result)
        {

            //result.Response.StatusCode = 400;
            context.Result = result.Page();

            DateTime dt = DateTime.Now;

            var thisEvent = await _context.Events.Include(x => x.AdminCompany).Where(x => x.Domain == context.HttpContext.Request.Host.Host && x.Status == 1 && x.ActiveFromDateTime <= dt && x.ActiveToDateTime > dt).OrderBy(x => x.ActiveFromDateTime).FirstOrDefaultAsync();

            if (thisEvent != null)
            {
                if (thisEvent.Logo != null)
                {
                    result.ViewData["Site_EventLogo"] = "/data/" + thisEvent.AdminCompany.Id + "/" + thisEvent.Id + "/media/" + thisEvent.Logo;
                }
                else
                {
                    result.ViewData["Site_EventLogo"] = "/data/" + thisEvent.AdminCompany.Id + "/_system/media/" + thisEvent.AdminCompany.Logo;
                }
                result.ViewData["Site_EventId"] = thisEvent.Id.ToString();
                result.ViewData["Site_EventName"] = thisEvent.Name;
                result.ViewData["Site_EventDomain"] = thisEvent.Domain;
                result.ViewData["Site_CompanyId"] = thisEvent.AdminCompany.Id;
                result.ViewData["Site_CompanyName"] = thisEvent.AdminCompany.Name;
                result.ViewData["Site_CompanyAddress"] = thisEvent.AdminCompany.Address;
                result.ViewData["Site_CompanyPostalCode"] = thisEvent.AdminCompany.PostalCode;
                result.ViewData["Site_CompanyCity"] = thisEvent.AdminCompany.City;
                result.ViewData["Site_CompanyPhone"] = thisEvent.AdminCompany.Phone;
                result.ViewData["Site_CompanyEmail"] = thisEvent.AdminCompany.Email;
                //await next.Invoke();
            }
            else
            {
                context.HttpContext.Response.Redirect("/error/404");
            }

        }

    }

    public async Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context) => await Task.CompletedTask;

}

我的问题是,当我为ViewData对象分配值时,出现NullReferenceException: Object reference not set to an instance of an object.错误。

我该如何解决?我确实知道NullReferenceException是什么,我只是不知道为什么在此示例中得到它。

2 个答案:

答案 0 :(得分:0)

在讨论了这个问题之后,第一步是弄清楚为什么PageResult总是返回null。找到答案here。解决第一个问题后,发现在调用await next.Invoke();时遇到以下错误:If an IAsyncPageFilter provides a result value by setting the Result property of PageHandlerExecutingContext to a non-null value, then it cannot call the next filter by invoking PageHandlerExecutionDelegate

要解决此错误,删除了结果结果context.Result = result.Page();的分配,然后再次调用了任务,从而解决了整个问题。

答案 1 :(得分:-1)

ViewData是一个字典,这意味着要插入一个新项目,您将必须使用Add方法:

result.ViewData.Add("Site_EventLogo", "/data/" + thisEvent.AdminCompany.Id + "/" + thisEvent.Id + "/media/" + thisEvent.Logo);