ASP.NET MVC3: есть ли способ получить отражение MethodInfo для разрешенного действия? - PullRequest
2 голосов
/ 25 ноября 2011

Из пользовательского расширения HtmlHelper я хотел бы получить MethodInfo для действия.

Я знаю, что могу получить Тип контроллера и строковое имя действия из:

public static void MyHelper(this HtmlHelper helper)
{
  var controller = helper.ViewContext.Controller;
  var actionName = ViewContext.Controller.ValueProvider.GetValue("action").RawValue;
}

Но я действительно хочу MethodInfo, потому что я хочу извлечь пользовательский Attribute из метода действия.Я не могу просто вызвать рефлексию .GetMethod(actionName);, потому что обычно существует более 1 с одним и тем же именем (два действия с одинаковым именем, одно для http GET и одно для POST).

На данный моментЯ думаю, что мне, возможно, придется вручную получить все методы с именем действия и просмотреть всю информацию в ViewContext.Controller.ValueProvider, чтобы увидеть, какой метод имеет параметры, соответствующие значениям в поставщике, но я надеюсь, что MethodInfo уже где-то доступен...

Ответы [ 3 ]

2 голосов
/ 25 ноября 2011

Там действительно нет простого способа достичь этого.Обычно вы украшаете действия контроллера с помощью фильтров пользовательских действий (а не просто атрибутов любого типа).Таким образом, вы можете сделать так, чтобы этот фильтр настраиваемых действий вставлял некоторую информацию в текущий HttpContext, чтобы помощник HTML знал, что представление обслуживалось из действия контроллера, украшенного этим фильтром настраиваемых действий.

0 голосов
/ 24 октября 2012

Я ответил на свой вопрос, очень похожий на этот.

Учитывая действующий контроллер, имя другого контроллера и действия, а также метод http (GET, POST), я разработал метод, который может получить атрибуты.

Примерно так:

public static Attribute[] GetAttributes(
    this Controller @this,
    string action = null,
    string controller = null,
    string method = "GET")

Вы называете это так:

var attrs = liveController
    .GetAttributes("anotherAction", "anotherController", "POST");
0 голосов
/ 12 сентября 2012

Один из способов получить MethodInfo текущего действия - использовать комбинацию StackTrace и RouteData.

Вам необходимо отфильтровать все ненужные кадры StackTrace.

Код будет работать из вложенного класса Controller, куда вы помещаете своих общих помощников, или вы можете поместить в родительский Controller

public FooController : BaseController
{
    [YourCustomAttribute]
    public ActionResult Edit(int id)
    {

       MethodInfo action = CurrentExecutingAction();

       // your code here, now you can get YourCustomAttribute Attribute for the Action

    }
}

public abstract class BaseController : Controller
{

    protected MethodInfo CurrentExecutingAction(Type type = null)
    {
        type = type ?? GetType();
        var rd = ControllerContext.RouteData;
        var currentAction = rd.GetRequiredString("action");

        StackTrace s = new StackTrace();
        return s.GetFrames()
            .Select(x => x.GetMethod())
            .Where(x => x is MethodInfo && x.Name == currentAction && x.DeclaringType.IsAssignableFrom(type))
            .Select(x => (MethodInfo) x)
            .LastOrDefault();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...