【问题标题】:Fill ViewData on Every Action but not on renderaction在每个动作上填充 ViewData 但不在渲染动作上
【发布时间】:2012-03-09 14:05:52
【问题描述】:

我有一个viewData,每个页面都需要它。如果我使用onActionExecuting 填写此ViewData。即使是部分页面的操作结果,它也会为每个操作填充。我希望每次页面加载仅填充一次 ViewData。 任何建议

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing viewdata


    【解决方案1】:

    您可以使用 OnActionExecuting 事件并测试视图返回的结果是普通视图还是部分视图,并据此决定是否将信息添加到 ViewData:

    public class MyActionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Result is ViewResult)
            {
                filterContext.Controller.ViewData["foo"] = "bar";
            }
        }
    }
    

    为所有视图提供一些通用数据的另一种可能性是在单独的子操作中将其外部化,并使用Html.Action helper 将其包含在您的布局中。

    【讨论】:

    • 我在 filterContext.Result 中得到空值。我正在考虑第二种方法,也让我看看它是否可以解决问题
    • @Tassadaque,什么是空值? filterContext?还是filterContext.Result?或者是其他东西?您的确切代码如何?控制器动作呢?
    • filterContext.Result is null in filtercontext 我得到 ?filterContext {System.Web.Mvc.ActionExecutingContext} base {System.Web.Mvc.ControllerContext}: {System.Web.Mvc.ActionExecutingContext} ActionDescriptor: {System.Web.Mvc.ReflectedActionDescriptor} ActionParameters:Count = 7 结果:null
    • 我只是将它添加到我的客户 actionfilterattribute 的代码之一中,即 public class RequiresAuthenticationAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext)
    • @Tassadaque,当然 filterContext.Result 在OnActionExecuting 中将为空。此事件在操作运行之前执行,因此您还不能期望得到结果。您应该改用OnActionExecuted 事件。
    猜你喜欢
    • 2021-03-01
    • 2014-01-02
    • 2013-02-27
    • 2013-03-15
    • 2018-07-10
    • 2011-11-07
    • 2017-06-22
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多