Поиск параметров метода действия mvc3 в пользовательском атрибуте - PullRequest
4 голосов
/ 09 декабря 2011

Я работаю над реализацией управления правами пользователей в приложении mvc3.

Я определил свои методы действий в базе данных с помощью ControllerName, ActionName, а Parameters состоит из ParameterName и ParameterType и т. Д.

Iреализовал пользовательский атрибут, который унаследован от атрибута Authorize.

Я пытаюсь найти действие, выполняемое среди моих встроенных действий, определенных в базе данных, и вычислить, есть ли у пользователя разрешение на указанное действие или нет.

Код выглядит так:

[HttpPost]
[MyAuthorize]
public ActionResult Edit(VendorPageItem entity)
{
  //...
}

public class MyAuthorize: System.Web.Mvc.AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException("httpContext");

        string controller = httpContext.Request.RequestContext.RouteData.Values["controller"].ToString();
        string action = httpContext.Request.RequestContext.RouteData.Values["action"].ToString();
        int userId = SessionState.Current.LoginParameter.VendorUserID;

        List<string> parameterTypes = new List<string>();
        //TODO: Find out action method parameter types. 

        return IoCWorker.Resolve<IUserRightService>().HasUserRightToAction(userId, controller, action, parameterTypes);
    }
}

Моя проблема заключается в поиске типов параметров метода в моем настраиваемом атрибуте.

Спасибо.

редактировать: забылупомянуть, что это пост действий.[HttpPost] добавлено.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Я думаю, что отражение здесь ответ.

Если у вас есть контроллер и действие, и если вы заранее знаете пространство имен, вы можете проверить контроллер Type и перейти к его методам и относительным сигнатурам / перегрузкам.

Также проверка полного содержимого RouteData, кроме контроллера и действия, может сказать вам, что оно передается методу.

Я не пробовал, но из того, что вы говорите, кажется, что это сработает.

1 голос
/ 09 декабря 2011

Я не уверен, правильно ли я понял ваш вопрос. Если вы попытаетесь получить доступ к значениям параметров, у меня есть для вас ответ, если вы действительно хотите знать типы параметров, то ответ @Matteo Mosca будет правильным:

Это зависит от того, откуда берутся параметры. Будь то параметры QueryString, параметры формы, файлы cookie или ...

Инфраструктура связывания моделей ASP.NET пытается сопоставить параметры метода действия. В вашей пользовательской атрибуте вы можете получить доступ к параметрам в контексте, например,

string input = httpContext.Request.Form["myInput"]

EDIT: Это, конечно, не самое лучшее решение, потому что вам нужна информация о размещенных параметрах. Так как я не знаю ваших реальных требований, я не могу сделать лучшего предложения. Конечно, вы можете перебирать коллекцию Form.

Возможно, вы передадите имя поля в качестве параметра / свойства MyAuthorizeAttribute.

...