Подтвердить что ты не робот

ASP.NET MVC: Action Filter для настройки переменных контроллера?

У меня есть сценарий, при котором с каждым запросом страницы я должен проверить сеанс присутствия определенного идентификатора. Если это найдено, я должен захватить связанный объект из базы данных и сделать его доступным для контроллера. Если идентификатор сеанса не найден, мне нужно перенаправить пользователя (срок действия сеанса).

В настоящий момент у меня есть пользовательский кусок кода (пара строк), который делает это в начале каждого метода действий внутри моего контроллера, что кажется ненужным повторением.

Является ли этот сценарий достойным фильтра действий?

Спасибо

UPDATE Некоторая большая информация здесь ребята. Спасибо вам

4b9b3361

Ответ 1

Да, это похоже на хорошее применение фильтра действий, так как вы можете применить его на уровне контроллера для работы со всеми действиями. Вы также можете сделать его частью базового класса контроллера, если вы не хотите добавлять его ко всем контроллерам вручную или написать собственный контроллер factory, который автоматически применяет этот фильтр действий к каждому контроллеру.

Смотрите объект ASP.NET MVC Pass из пользовательского фильтра действий в действие для передачи данных из фильтра действий в действие.

Ответ 2

Создайте базовый контроллер, как этот

   public class MyContollerController : Controller
    {
        public DataEntity userData;
        protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {            
            base.Initialize(requestContext);
            var customId = requestContext.HttpContext.Session["key"];
            if(customId!=null)
            {
                 userData=getDataGromDataBase(customId);
            }   
            else
            {
               //redirect User
            }     
        }
    }

Теперь создайте контроллеры ur, такие как

public class MyDemoController : MyContollerController
{
        public ActionResult Action1()
        { 
             //access your data
             this.userData

        }
        public ActionResult Action2()
        { 
             //access your data
             this.userData

        }
}

Ответ 3

Другой способ - сделать это с помощью Binders. Предположим, что объектом является ShoppingCart

//Custom Model Binder
public class ShoppingCarModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            //TODO: retrieve model or return null;
        }
    }
 //register that binder in global.asax in application start

ModelBinders.Binders.Add(typeof(ShoppingCart), new ShoppingCartBinder());

// controller action

public ActionResult DoStuff(ShoppingCart cart)
{
     if(cart == null)
     {
     //whatever you do when cart is null, redirect. etc
     }
     else
     {
     // do stuff with cart
     }
}

Кроме того, это более понятный и понятный метод, так как это действие зависит от параметров, поставляемых извне