我正在创建的站点自定义颜色可以由用户设置(仅在某些页面上)。我希望在ActionFilterAttribute中获取这些数据,并将其设置在ViewBag中,这样我就可以在ViewBag中获取数据了。
这是我的ActionFilterAttribute。
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
我非常肯定,我没有正确地理解一些关于过滤器的东西,我希望得到关于如何实现我想要做的事情的指导。
发布于 2016-03-16 12:53:01
ActionExecutingContext.Controller被声明为Object类型,因为框架没有对哪些类可以是控制器施加任何限制。
如果您总是创建从基类Controller类继承的控制器,则可以在筛选器中使用该假设,并将context.Controller转换为Controller。
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";
}如果您不能这样做,那么您可以使用类似的方法在上下文中检查结果:
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);
}发布于 2016-05-06 07:49:01
将context.Controller转换为控制器
尝试更改以下行
context.Controller.ViewBag.OptionsData = await optionsDataHelper.GetValueAsync(personId, CancellationToken.None);至
((Controller)(context.Controller)).ViewBag.OptionsData = await optionsDataHelper.GetValueAsync(personId, CancellationToken.None);https://stackoverflow.com/questions/35998262
复制相似问题