Net Core 2.0将数据从IPageFilter属性传递到Razor Pages PageModel

时间:2018-02-07 15:12:29

标签: c# attributes .net-core razor-pages

如何将数据(对象)从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做任何方式吗?

3 个答案:

答案 0 :(得分:2)

不幸的是没有。 ViewDataTempData仅与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之外的任何东西,但是如果有人知道,请更正我。