Asp.net mvc ASP.NET MVC:从操作体内部访问公共ActionFilter成员
假设我在控制器中的动作方法上有一个ActionFilterAttribute。此操作筛选器公开两个公共成员(在本例中为属性)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
在我的操作方法主体中是否有任何方法可以访问这些公共属性(只读需要)?属性属性只能是常量,并且必须在编译时已知:
[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
值将值传递给控制器。