Есть ли способ, чтобы атрибут ac # мог посылать параметр из метода, на котором он используется - PullRequest
0 голосов
/ 19 марта 2012

Как я могу передать в атрибут параметр, который был отправлен в функцию, для которой этот атрибут использовался?например, мне нужно сделать что-то вроде этого ...

[Authorize, AuthorizeLimited( ModuleID=pageModuleId)]
[HttpPost]
public ActionResult MoveModule(int pageModuleId, int sequence)
{
    db.PageModule_Move(pageModuleId, sequence);
    return Json("OK");
}

Отправленный методу pageModuleId должен также перейти к атрибуту.Извините, если об этом уже спрашивали, я не смог найти ответ.

РЕДАКТИРОВАТЬ

ОК, используя ответ, предоставленный @jrummell, вот мой первый атрибут фильтра действий :) Это просто остановитькто-то редактирует модуль (используемый ajax), у которого нет разрешения.

public class AuthorizeModuleEditAttribute : ActionFilterAttribute
{
    private int _moduleID;

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        foreach (var parameter in filterContext.ActionParameters)
        {
            if (parameter.Key == "pageModuleId")
            {
                _moduleID = (int)filterContext.ActionParameters["pageModuleId"];
            }
        }

        if (!SiteHelper.UserPermsForModule(_moduleID)) //checks if user has perms to edit module
            throw (new Exception("Invalid user rights"));

        base.OnActionExecuting(filterContext);
    } 
}

Ответы [ 2 ]

4 голосов
/ 19 марта 2012

Нет, значения параметров атрибута должны быть постоянными времени компиляции.

Однако, если вы реализуете свой собственный фильтр действий , вы можете переопределить OnActionExecuting и проверить параметры действия в filterContext.ActionParamters.

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    foreach(var parameter in filterContext.ActionParameters)
    {
        if (parameter.Key == "pageModuleId")
        {
             // do something with pageModuleId
        }
    }

    base.OnActionExecuting(filterContext);
}
1 голос
/ 19 марта 2012

Атрибут связан с методом, а не с вызовом метода и его параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...