ASP.NET MVC: фильтр действий для настройки переменных контроллера? - PullRequest
15 голосов
/ 13 июля 2011

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

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

Достойен ли этот сценарий Фильтр действий?

Спасибо

UPDATE Здесь есть отличная информация, ребята. Спасибо

Ответы [ 3 ]

10 голосов
/ 13 июля 2011

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

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

9 голосов
/ 13 июля 2011

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

   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
            }     
        }
    }

Теперь создайте свои контроллеры наподобие этого

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

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

        }
}
3 голосов
/ 13 июля 2011

Другой способ сделать это с помощью Model Binder.Предположим, что объектом является 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
     }
}

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

...