Изменить модель в ActionFilter - PullRequest
       32

Изменить модель в ActionFilter

6 голосов
/ 12 января 2010

У меня есть actionfilter, который я запускаю OnActionExecuting в ASP.NET MVC 2. По сути, я хотел бы, чтобы actionfilter очистил мои данные и заменил текущую модель (которая будет передана последующим фильтрам действий, а также моему методу действий) на продезинфицированная модель. Возможно ли это и является ли это плохой идеей - если да, то почему?

Заранее спасибо, JP

Ответы [ 3 ]

6 голосов
/ 12 января 2010

Вот для MVC v1, я надеюсь, что это не изменилось в v2:

var view = filterContext.Result as ViewResultBase;
if (view != null)
   view.ViewData.Model ...

Я не понимаю, почему вы хотите сделать это в OnActionExecuting, но если вы должны , сделайте это там и установите какой-нибудь флаг (приватное поле), который OnActionExecuted должен настроить в получившейся модели. Но вам все равно придется использовать последнее, за исключением случаев, когда вы присваиваете .Result - в этом случае ваше действие вообще не будет вызываться и будет использоваться назначенный результат.

6 голосов
/ 12 января 2010

Если вам нужно иметь дело с вашими моделями, вы, вероятно, будете иметь дело с большей частью в рамках одного контроллера (разве все ваши контроллеры используют одинаковые типы моделей?). Альтернативный подход заключается в переопределении методов OnActionExecuting() и OnActionExecuted() самих контроллеров. Это позволяет вам сохранить свою бизнес-логику в области действия контроллера.

Обычно ActionFilters используются для сквозных задач - то, что вы хотите запустить для многих методов действий, независимо от того, где они существуют в приложении. Поэтому, если ваша логика санации модели не применима ко многим контроллерам и действиям, или не является очень общей (что, возможно, так и есть, в этом случае ваш подход, вероятно, хорош), вы можете захотеть вывести ее из фильтров и в свои контроллеры. Если это что-то, что может применяться в широком смысле, тогда ActionFilter вполне подойдет.

2 голосов
/ 18 декабря 2013

Кстати, для MVC 3 и 4:

filterContext.Controller.ViewData.Model
...