Asp.net mvc ASP.NET MVC:从操作体内部访问公共ActionFilter成员

Asp.net mvc ASP.NET MVC:从操作体内部访问公共ActionFilter成员,asp.net-mvc,action-filter,Asp.net Mvc,Action Filter,假设我在控制器中的动作方法上有一个ActionFilterAttribute。此操作筛选器公开两个公共成员(在本例中为属性) 在我的操作方法主体中是否有任何方法可以访问这些公共属性(只读需要)?属性属性只能是常量,并且必须在编译时已知: [MyActionFilter(Prop1 = "SomeProp1", Prop2 = "SomeProp2")] public ActionResult SomeAction() { // use "SomeProp1" and "SomeProp

假设我在控制器中的动作方法上有一个ActionFilterAttribute。此操作筛选器公开两个公共成员(在本例中为属性)


在我的操作方法主体中是否有任何方法可以访问这些公共属性(只读需要)?

属性属性只能是常量,并且必须在编译时已知:

[MyActionFilter(Prop1 = "SomeProp1", Prop2 = "SomeProp2")]
public ActionResult SomeAction() 
{
    // use "SomeProp1" and "SomeProp2" here
    ...
}
因此,在动作中,您已经知道这些值,因为您已经在动作方法签名上方对它们进行了硬编码。为了避免在程序的两个不同位置硬编码魔术字符串,可以使用常量:

public const string Prop1 = "SomeProp1";
public const string Prop2 = "SomeProp2";
然后:

[MyActionFilter(Prop1 = Constants.Prop1, Prop2 = Constants.Prop2)]
public ActionResult SomeAction() 
{
    // use Constants.Prop1 and Constants.Prop2 here
    ...
}
当然,您可以始终使用反射:

var myFilters = (MyActionFilterAttribute[])MethodInfo.GetCurrentMethod()
    .GetCustomAttributes(typeof(MyActionFilterAttribute), false);
if (myFilters.Length > 0)
{
    var prop1 = myFilters[0].Prop1;
    var prop2 = myFilters[0].Prop2;
}

但我认为这是一种巨大的浪费,所以不要这样做:-)

你为什么要这样做?您可以通过设置
context.controller.ViewData
值将值传递给控制器。