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

C# 如何在自定义ActionFilterAttribute中访问模型和元数据?,c#,asp.net-mvc-3,model-view-controller,metadata,viewdata,C#,Asp.net Mvc 3,Model View Controller,Metadata,Viewdata,老问题是:如何在自定义ModelMetadataProvider中访问ViewData?这是不可能的。您不能/不应该访问模型元数据提供程序中的ViewData或任何与HttpContext相关的信息 更新: 在更新的问题之后,事情开始变得有点意义,所以让我们更新答案: public class CheckMetadataAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExec

老问题是:如何在自定义ModelMetadataProvider中访问ViewData?这是不可能的。

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


更新:

在更新的问题之后,事情开始变得有点意义,所以让我们更新答案:

public class CheckMetadataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // get model
        // get metadata for each model property
        // set viewdata if metadata X exists
    }
}
显然,在ASP.NET MVC应用程序中使用
ViewData
是我绝对不推荐的<代码>视图数据类型较弱。无论您试图实现什么(顺便说一句,如果您已经解释了您的目标是什么,那就太好了),不要使用ViewData,使用视图模型和强类型视图


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

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


更新:

在更新的问题之后,事情开始变得有点意义,所以让我们更新答案:

public class CheckMetadataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // get model
        // get metadata for each model property
        // set viewdata if metadata X exists
    }
}
显然,在ASP.NET MVC应用程序中使用
ViewData
是我绝对不推荐的<代码>视图数据类型较弱。无论您试图实现什么(顺便说一句,如果您已经解释了您的目标是什么,那就太好了),不要使用ViewData,使用视图模型和强类型视图


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

我知道这可能不是最好的地方。我仍然想知道是否可以访问ViewData。@Jared,模型元数据提供程序绝对不是访问ViewData之类的对象的正确位置,因为ViewData的生命周期与元数据提供程序的生命周期大不相同。还有其他方法可以实现你想要实现的目标。回答你的问题,不,这是不可能的,这两个系统之间没有联系,也不应该有联系,因为它们实现了两个完全不同的目的,不应该混合。好吧,看起来这是不可能的。如何从自定义操作筛选器访问元数据?(问题和代码更改)对于每个模型,我指的是模型上的每个属性。我想做的很简单。我有一个模型的属性,该属性已从文本更改为下拉列表。使其成为下拉列表很容易,它从同名的viewdata项中拾取其项。我要做的是检查元数据,如果一个属性有一个UIHint“DropDownList”,则解析一个名为“{property}SelectListBuilder”的类,并将其填充到ViewData中。换句话说,我正在尝试为“DropDownList”属性创建一个约定,自动从数据源类获取值。我仍然想知道是否可以访问ViewData。@Jared,模型元数据提供程序绝对不是访问ViewData之类的对象的正确位置,因为ViewData的生命周期与元数据提供程序的生命周期大不相同。还有其他方法可以实现你想要实现的目标。回答你的问题,不,这是不可能的,这两个系统之间没有联系,也不应该有联系,因为它们实现了两个完全不同的目的,不应该混合。好吧,看起来这是不可能的。如何从自定义操作筛选器访问元数据?(问题和代码更改)对于每个模型,我指的是模型上的每个属性。我想做的很简单。我有一个模型的属性,该属性已从文本更改为下拉列表。使其成为下拉列表很容易,它从同名的viewdata项中拾取其项。我要做的是检查元数据,如果一个属性有一个UIHint“DropDownList”,则解析一个名为“{property}SelectListBuilder”的类,并将其填充到ViewData中。换句话说,我试图为“DropDownList”属性创建一个约定,该属性自动从数据源类获取值。