Jas*_*Cav 6 asp.net-core-mvc asp.net-core
我正在创建可以由用户设置的自定义颜色的网站(仅在某些页面上).我想在ActionFilterAttribute中获取该数据并将其设置在ViewBag中,以便我可以在_Layout.cshtml中获取数据.
这是我的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);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我在ViewBag上收到一条错误,指出:
'object'不包含'ViewBag'的定义,并且没有扩展方法'ViewBag'可以找到接受'object'类型的第一个参数(你是否缺少using指令或汇编引用?)[dnx451]
我很确定我对滤波器没有正确理解,我很欣赏如何实现我想要的指导.
Dan*_*.G. 15
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";
}
Run Code Online (Sandbox Code Playgroud)
如果你不能做出这个假设,那么你可以使用类似的方法检查上下文中的结果:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4509 次 |
| 最近记录: |