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?那是不行的。
答案 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过敏。当我进行代码审查并看到人们使用它们时,我知道他们做错了。