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 来完成这项工作?

不幸的是没有。 ViewDataTempData 仅与 PageResult 相关,过滤器管道甚至不知道 Result 是什么。

烦人的是,用于创建 PageHandlerXXXXContextPageContext 确实有一个 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();
}