【发布时间】:2014-08-16 00:04:17
【问题描述】:
您好,我想为我的应用程序中的每个控制器创建自定义 ActionFilterAttribute,该属性应该设置一些 ViewBag 值。 ActionFilterAttribute 是否适合它以及如何访问 ActionFilterAttribute 中的 viewbag ?
【问题讨论】:
您好,我想为我的应用程序中的每个控制器创建自定义 ActionFilterAttribute,该属性应该设置一些 ViewBag 值。 ActionFilterAttribute 是否适合它以及如何访问 ActionFilterAttribute 中的 viewbag ?
【问题讨论】:
你可以这样做
public class SomeMsgAttribute : FilterAttribute, IResultFilter
{
public void OnResultExecuted(ResultExecutedContext filterContext)
{
}
public void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.Controller.ViewBag.Msg= "Hello";
}
}
使用:
[SomeMsg]
public ActionResult Index()
{
return View();
}
【讨论】:
Executing 中有效,但在Executed 中无效?
OnResultExecuted 在渲染剃刀视图后调用。到那个时候,改变输出已经太迟了。
OnResultExecuted是在action方法返回后立即调用的,可惜:)我应该想到的:)谢谢。
试试这个
public class CustomFilterAttribute : ActionFilterAttribute
{
public override void
OnActionExecuting(ActionExecutingContext filterContext)
{
// get the view bag
var viewBag = filterContext.Controller.ViewBag;
// set the viewbag values
viewBag.CustomValue = "CustomValue";
}
}
【讨论】:
对于 ASP.NET Core,您可以执行以下操作
public class SomeFilterAttribute : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
Controller controller = context.Controller as Controller;
controller.ViewBag.CustomValue = customVal;
controller.ViewData["CustomValue "] = customVal;
controller.TempData["CustomValue "] = customVal;
}
}
然后从控制器
[TypeFilter(typeof(ValidateAppFeatureEnabled))]
public IActionResult Index()
{
var foo = ViewBag.CustomValue;
var bar = (type)ViewData["CustomValue"];
var buzz = (type)TempData["CustomValue"];
// Whatever else you need to do
return View();
}
【讨论】:
从不同的控制器动作传输数据
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
EmployeeTrackingSystemAndMISEntities db = new EmployeeTrackingSystemAndMISEntities();
var UserCookie = filterContext.HttpContext.Request.Cookies["UserUniqueID"];
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("action", "UserLogIn");
redirectTargetDictionary.Add("controller", "Login");
var TempData = filterContext.Controller.TempData;
TempData["Status"] = "Please log in as Admin";
filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
【讨论】: