在 PageFilter 中为 ViewData 赋值时出错
Error when assigning value to ViewData in PageFilter
我正在开发 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 是什么,我只是不知道为什么我在这个例子中得到它。
在讨论这个问题之后,第一步是弄清楚为什么 PageResult
总是返回 null
。已找到此问题的答案 。解决第一个问题后,发现在调用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();
被删除,然后再次调用任务,解决了整个问题。
我正在开发 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 是什么,我只是不知道为什么我在这个例子中得到它。
在讨论这个问题之后,第一步是弄清楚为什么 PageResult
总是返回 null
。已找到此问题的答案 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();
被删除,然后再次调用任务,解决了整个问题。