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

Jag*_*uir 1 c# model-view-controller viewdata metadata asp.net-mvc-3

public class CheckMetadataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // get model
        // get metadata for each model property
        // set viewdata if metadata X exists
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*rov 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";
                }
            }
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

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

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