【问题标题】:How do I access the model and Metadata within a custom ActionFilterAttribute?如何访问自定义 ActionFilterAttribute 中的模型和元数据?
【发布时间】:2011-10-03 18:15:46
【问题描述】:
public class CheckMetadataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // get model
        // get metadata for each model property
        // set viewdata if metadata X exists
    }
}

老问题是:如何在自定义 ModelMetadataProvider 中访问 ViewData?那是不行的。

【问题讨论】:

    标签: c# asp.net-mvc-3 model-view-controller metadata viewdata


    【解决方案1】:

    您不能/不应访问模型元数据提供程序中的 ViewData 或任何 HttpContext 相关信息。


    更新:

    更新后的问题开始有点意义,所以让我们更新答案:

    public class CheckMetadataAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
    
            // get model?
            var result = filterContext.Result as ViewResultBase;
            if (result != null)
            {
                var model = result.Model;
                if (model != null)
                {
                    // get metadata for model (you have a single model, no idea what you meant by "for each model" in your question)
                    var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, model.GetType());
                    if (metadata.DisplayName == "foo bar")
                    {
                        // set viewdata if metadata X exists
                        filterContext.Controller.ViewData["foo"] = "bar";
                    }
                }
            }
        }
    }    
    

    显然,在 ASP.NET MVC 应用程序中使用 ViewData 是我绝对不推荐的。 ViewData 是弱类型的。无论你想要达到什么目的(如果你已经解释了你的目标,那就太好了),不要使用 ViewData,使用视图模型和强类型视图。

    我个人对 ASP.NET MVC 应用程序中的 ViewBag/ViewData 之类的东西过敏。当我进行代码审查并看到人们使用它们时,我知道他们做错了什么。

    【讨论】:

    • 我知道这可能不是最好的地方。我仍然想知道是否可以访问 ViewData。
    • @Jared,模型元数据提供者绝对不是访问诸如 ViewData 之类的东西的正确位置,它的生命周期与元数据提供者的生命周期大不相同。还有其他方法可以实现您想要实现的任何目标。要回答你的问题,不,这是不可能的,这两个系统之间没有联系,也不应该有,因为它们完成了两个完全不同的目的,不应该混合。
    • 好的,看起来不行。从自定义操作过滤器访问元数据怎么样? (问题和代码已更改)
    • 对于每个模型,我指的是模型上的每个属性。我想做的很简单。我的模型属性已从文本更改为下拉菜单。使它成为一个下拉列表很容易,它从同名的 viewdata 项中获取它的项。我要做的是检查元数据,如果属性的 UIHint 为“DropDownList”,则解析一个名为“{Property}SelectListBuilder”的类并将其填充到 ViewData 中。换句话说,我正在尝试为自动从数据源类获取值的“DropDownList”属性创建一个约定。
    猜你喜欢
    • 2011-03-26
    • 2011-01-12
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多