【问题标题】:Error when assigning value to ViewData in PageFilter在 PageFilter 中为 ViewData 赋值时出错
【发布时间】:2019-11-22 02:39:17
【问题描述】:

我正在开发一个 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.-error。

我该如何解决这个问题?我确实知道 NullReferenceException 是什么,只是不知道为什么我在这个例子中得到它。

【问题讨论】:

  • 谢谢,@RahulSharma。我知道 NullReferenceException 是什么,只是不知道为什么我在这个例子中得到它。
  • 这个链接有你案例的解释:stackoverflow.com/questions/53984956/…
  • 我也发现了这一点,它似乎把我带到了某个地方。问题是,当我实现它时,处理程序中的代码没有执行/返回到视图?请查看更新后的问题。
  • 你的问题是你调用你的任务:await next.Invoke();。我可以看到它被注释掉了

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


【解决方案1】:

在讨论了这个问题之后,第一步是弄清楚为什么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

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

【讨论】:

  • 谢谢你,拉胡尔。一个小问题,如果你不介意的话:在这种情况下,PageFilter 是让我得到我想要的东西的“正确”方式吗?以前我在看一个 BasePageModel,但我无法让它保存 ViewData。也许只是“过滤器”这个名字让我想到了别的东西。
  • @Mads PageFilter 方式在您的情况下是正确的,因为您正在访问 HttpContextFiltersMiddleware 的不同之处在于它们提供对 HttpContext 的访问。您可能想要在过滤器中做的一件事是从外部资源(数据库、Web 服务等)获取数据,然后在您正在做的 PageModel 或 ViewData 中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2021-11-13
  • 2016-04-01
  • 1970-01-01
相关资源
最近更新 更多