Я воспринял это как своего рода проблему - пытаясь внедрить пользовательские ActionMethodSelector
в список существующих. Хотя я не нашел ни одного пуленепробиваемого способа сделать это, я поделюсь тем, что я придумала
1. Создайте пользовательский ActionInvoker
и попробуйте ввести селектор. Я использовал значение по умолчанию ReflectedActionDescriptor
, поскольку оно уже содержит MethodInfo
для проверки MyActionMethodSelector
.
public class MyActionInvoker : ControllerActionInvoker
{
protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName)
{
var action = base.FindAction(controllerContext, controllerDescriptor, actionName);
if (action != null)
{
var reflectedActionDecsriptor = action as ReflectedActionDescriptor;
if (reflectedActionDecsriptor != null)
{
if (new MyActionMethodSelectorAttribute().IsValidForRequest(controllerContext, reflectedActionDecsriptor.MethodInfo))
{
return null;
}
}
}
return action;
}
}
2.Введите MyActionInvoker
в контроллеры. Для этого выведите все контроллеры из MyBaseController
, реализованные как
public class MyBaseController : Controller
{
protected override IActionInvoker CreateActionInvoker()
{
return new MyActionInvoker();
}
}
Вот и все сейчас:)