Net Core 2.0 将数据从 IPageFilter 属性传递到 Razor Pages PageModel
Net Core 2.0 pass data from IPageFilter Attribute to Razor Pages PageModel
我如何将数据(对象)从 IPageFilter 属性传递到 Razor Page PageModel。我可以在这个过滤器中创建一个 ViewData["example"] = object 吗?
我可以这样做;
public void OnPageHandlerSelected(PageHandlerSelectedContext context)
{
//i want like this
//ViewData["Member"] = memberUser;
context.HttpContext.Items.Add("Member", memberUser);
}
但是每次我都必须从 Items 中获取这个对象。
有什么方法可以使用 ViewData 或 TempData 来完成这项工作?
不幸的是没有。 ViewData
和 TempData
仅与 PageResult
相关,过滤器管道甚至不知道 Result
是什么。
烦人的是,用于创建 PageHandlerXXXXContext
的 PageContext
确实有一个 ViewData
属性,但您无法从IPageFilter
.
您可以通过上下文的 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 之外还有什么可能,但如果有人知道否则请纠正我。
如果您没有为页面定义页面模型 class,则 "HandlerInstance as PageModel" 始终为空。在这种情况下需要检查为 Page:
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();
}
我如何将数据(对象)从 IPageFilter 属性传递到 Razor Page PageModel。我可以在这个过滤器中创建一个 ViewData["example"] = object 吗?
我可以这样做;
public void OnPageHandlerSelected(PageHandlerSelectedContext context)
{
//i want like this
//ViewData["Member"] = memberUser;
context.HttpContext.Items.Add("Member", memberUser);
}
但是每次我都必须从 Items 中获取这个对象。
有什么方法可以使用 ViewData 或 TempData 来完成这项工作?
不幸的是没有。 ViewData
和 TempData
仅与 PageResult
相关,过滤器管道甚至不知道 Result
是什么。
烦人的是,用于创建 PageHandlerXXXXContext
的 PageContext
确实有一个 ViewData
属性,但您无法从IPageFilter
.
您可以通过上下文的 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 之外还有什么可能,但如果有人知道否则请纠正我。
如果您没有为页面定义页面模型 class,则 "HandlerInstance as PageModel" 始终为空。在这种情况下需要检查为 Page:
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();
}