Помогите с фильтрами действий в asp.net mvc 3 - PullRequest
1 голос
/ 10 августа 2011

Я хочу создать фильтр действий, который будет использоваться ТОЛЬКО двумя контроллерами в моем приложении ... Этот фильтр действий должен проверяться для каждого действия внутри ДВУ контроллеров.

Вот мой код фильтра действий

public class AllowedToEditEHRFilter : IActionFilter
    {
        IUnitOfWork unitOfWork;
        IRepository<EHR> ehrRepository;
        public AllowedToEditEHRFilter(IUnitOfWork dependency)
        {
            unitOfWork = dependency;
            ehrRepository = unitOfWork.EHRs;
        }

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            int ehrId;
            if (int.TryParse(filterContext.HttpContext.Request.QueryString["ehrId"], out ehrId))
            {
                EHR ehr = ehrRepository.FindById(ehrId);
                if (ehr.UserName != Membership.GetUser().UserName)
                    filterContext.Result = new ViewResult { ViewName = "InvalidOwner" };
            }
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }
    }

Теперь я просто не уверен, как настроить MVC-фреймворк так, чтобы фильтр действий запускался в подходящее время.

Я использую это в качестве ссылки, но это применяет GLOBAL actionfilter, и он не указывает, как ограничить только некоторые из ваших контроллеров.

Пожалуйста, помогите.

кстати я использую NinjectMVC3

Ответы [ 5 ]

3 голосов
/ 11 августа 2011

Это зависит от того, какое подходящее время.

См. Мой оригинальный пост в блоге

Или прочитайте другие страницыДокумент:

(вероятно, я должен связать их)

В основном вам нужнонастройте привязку для фильтра и определите некоторое условие:

kernel.BindFilter<AllowedToEditEHRFilter>(FilterScope.Action, 0).When...

например,

.WhenActionHas<AllowedToEditEHRAttribute>()

Обновление: В вашем случае просто

kernel.BindFilter<AllowedToEditEHRFilter>(FilterScope.Controller, 0).When(
    (controllerContext, actionDescriptor) =>  
     controllerContext.Controller is PhysicalTestsController)
2 голосов
/ 11 августа 2011
public class AllowedToEditEHRFilter : IActionFilter
    {
        IUnitOfWork unitOfWork;
        IRepository<EHR> ehrRepository;

        public AllowedToEditEHRFilter(IUnitOfWork dependency)
        {
            unitOfWork = dependency;
            ehrRepository = unitOfWork.EHRs;
        }

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            int ehrId;
            if (int.TryParse(filterContext.ActionParameters["ehrId"].ToString(), out ehrId))
            {
                EHR ehr = ehrRepository.FindById(ehrId);
                if (ehr.UserName != Membership.GetUser().UserName)
                    filterContext.Result = new ViewResult { ViewName = "InvalidOwner" };
            }
        }
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }
    }

И CustomFilterProvider

public class ConfiguredFilterProvider : IFilterProvider
    {
        private readonly IKernel _kernel;

        public ConfiguredFilterProvider(IKernel kernel)
        {
            _kernel = kernel;
        }

        public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
        {
            List<Filter> list = new List<Filter>();
            if (controllerContext.Controller is PhysicalTestsController)
            {

                list.Add(new Filter(
                            _kernel.Get(typeof(AllowedToEditEHRFilter)),
                            FilterScope.Global, order: null
                        ));
            }
            return list;
        }
    }

А в Ninject

kernel.Bind<IFilterProvider>()
              .To<ConfiguredFilterProvider>();

Возможно, это не самое чистое решение, но оно работает.

2 голосов
/ 10 августа 2011

Чтобы применить фильтр действий только к некоторым вашим контроллерам, просто добавьте атрибут к рассматриваемым контроллерам.

[AllowedToEditEHR]
public class YourController : Controller
{
    ...

Чтобы это работало, вы должны переименовать ваш фильтрAllowedToEditEHRAttribute, т.е. заменить "Фильтр" на "Атрибут" .Это стандартное соглашение по присвоению имен для атрибутов.

Обновление : Чтобы добавить зависимости в фильтр, просто украсьте его конструктор атрибутом [Inject].

1 голос
/ 10 августа 2011

Вы просто должны украсить эти два контроллера с помощью фильтра действий, как это

[AllowedToEditEHRFilter]
public class YourController : Controller
{
    ...
}

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

0 голосов
/ 10 августа 2011

Вместо реализации IActionFilter, расширьте ActionFilterAttribute, а затем назначьте атрибут двум контроллерам, на которые вы хотите повлиять:

public class AllowedToEditEHRFilter : ActionFilterAttribute
{
    // ...
}

и

[AllowedToEditEHRFilter]
public class MyController : Controller
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...