首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ViewBag设置ActionFilterAttribute

从ViewBag设置ActionFilterAttribute
EN

Stack Overflow用户
提问于 2016-03-14 21:18:00
回答 2查看 6.6K关注 0票数 8

我正在创建的站点自定义颜色可以由用户设置(仅在某些页面上)。我希望在ActionFilterAttribute中获取这些数据,并将其设置在ViewBag中,这样我就可以在ViewBag中获取数据了。

这是我的ActionFilterAttribute。

代码语言:javascript
复制
public class PopulateColorOptionsAttribute : ActionFilterAttribute
{
    private readonly OptionsDataHelper optionsDataHelper;

    public PopulateOptionsAttribute(OptionsDataHelper optionsDataHelper)
    {
        this.optionsDataHelper = optionsDataHelper;
    }

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        await base.OnActionExecutionAsync(context, next);

        // Get the cemetery data and set it on the view bag.
        var personId = Convert.ToInt32(context.RouteData.Values["personId"]);
        context.Controller.ViewBag.OptionsData = await optionsDataHelper.GetValueAsync(personId, CancellationToken.None);
    }
}

不幸的是,我在ViewBag上收到了一个错误,该错误声明:

'object‘不包含'ViewBag’的定义,也找不到接受'object‘类型的第一个参数的扩展方法'ViewBag’(您缺少使用指令还是程序集引用?)dnx451

我非常肯定,我没有正确地理解一些关于过滤器的东西,我希望得到关于如何实现我想要做的事情的指导。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-16 12:53:01

ActionExecutingContext.Controller被声明为Object类型,因为框架没有对哪些类可以是控制器施加任何限制。

如果您总是创建从基类Controller类继承的控制器,则可以在筛选器中使用该假设,并将context.Controller转换为Controller

代码语言:javascript
复制
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
    await base.OnActionExecutionAsync(context, next);

    var controller = context.Controller as Controller;
    if (controller == null) return;
    controller.ViewBag.Message = "Foo message";    
}

如果您不能这样做,那么您可以使用类似的方法在上下文中检查结果:

代码语言:javascript
复制
public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
    var viewResult = context.Result as ViewResult; //Check also for PartialViewResult and ViewComponentResult
    if (viewResult == null) return;
    dynamic viewBag = new DynamicViewData(() => viewResult.ViewData);
    viewBag.Message = "Foo message";

    await base.OnResultExecutionAsync(context, next);
}
票数 22
EN

Stack Overflow用户

发布于 2016-05-06 07:49:01

将context.Controller转换为控制器

尝试更改以下行

代码语言:javascript
复制
context.Controller.ViewBag.OptionsData = await optionsDataHelper.GetValueAsync(personId, CancellationToken.None);

代码语言:javascript
复制
((Controller)(context.Controller)).ViewBag.OptionsData = await optionsDataHelper.GetValueAsync(personId, CancellationToken.None);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35998262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档