如何在自定义ActionFilterAttribute中访问模型和元数据?

时间:2011-10-03 18:15:46

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

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?那是不行的。

1 个答案:

答案 0 :(得分:9)

您不能/不应该在模型元数据提供程序中访问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过敏。当我进行代码审查并看到人们使用它们时,我知道他们做错了。