如何将数据(对象)从IPageFilter属性传递到Razor Page PageModel。我可以在此过滤器中创建 ViewData ["示例"] =对象吗?
我可以这样做;
public void OnPageHandlerSelected(PageHandlerSelectedContext context)
{
//i want like this
//ViewData["Member"] = memberUser;
context.HttpContext.Items.Add("Member", memberUser);
}
但我必须每次都从物品中得到这个物品。
我可以用ViewData或TempData做任何方式吗?
答案 0 :(得分:2)
不幸的是没有。 ViewData
和TempData
仅与PageResult
相关,而过滤器渠道甚至不知道Result
将会是什么。
令人讨厌的是,用于创建PageContext
的{{1}}确实具有PageHandlerXXXXContext
属性,但您无法从ViewData
访问它
答案 1 :(得分:1)
如果未为页面定义页面模型类,则“ HandlerInstance as PageModel”始终为null。在这种情况下,需要检查为页面:
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
PageContext pageContext = null;
if (context.HandlerInstance is Page page) { pageContext = page.PageContext; }
else if(context.HandlerInstance is PageModel pageModel) { pageContext = pageModel.PageContext; }
if (pageContext != null)
{
pageContext.ViewData["UserEmail"] = "email";
}
await next.Invoke();
}
答案 2 :(得分:0)
您可以通过上下文的HandlerInstance
属性访问选定的PageModel,如下所示:
public void OnPageHandlerSelected(PageHandlerSelectedContext context) {
var pageModel = context.HandlerInstance as PageModel ??
throw new Exception("This page filter must run in a PageModel.");
pageModel.ViewData["Member"] = memberUser;
...
}
考虑到IPageFilter
仅适用于Razor Pages,我看不到HandlerInstance
可能是除PageModel之外的任何东西,但是如果有人知道,请更正我。