2010-01-12 15 views
5

ASP.NET MVC 2'de OnActionExecuting çalıştırdığım bir eylem filtresine sahibim. Temel olarak, eylem filtresinin verilerinizi sterilize etmesini ve geçerli modeli değiştirmesini (sonraki eylem filtrelerine geçirilecek olan) ve sanitized model ile de benim eylem yöntemim). Bu mümkün mü ve bu kötü bir fikir mi - eğer öyleyse? ActionFilter'da bir modeli değiştirme

JP, şimdiden teşekkürler

+0

kötü tasarım kokuyor. –

+7

Filip, eğer eleştireceksen lütfen yapıcı ol. Bana neden kötü bir tasarım olduğunu söyle, iyi alternatifler olarak ne gördüğünü söyle ... aksi takdirde yorumunuz benim için ve bu yazıyı okuyan başka herkes için işe yaramıyor ... –

cevap

5

Eğer modelleri ile uğraşmak gerekir, büyük olasılıkla (tek Kontrolör kapsamında daha uğraşan olacağız tüm Kontrolörler aynı modeli türlerini kullanmadıkça ?). Alternatif bir yaklaşım, Kontrolörlerin kendileri için OnActionExecuting() ve OnActionExecuted() yöntemlerini geçersiz kılmak olacaktır. Bu, iş mantığınızı denetleyici kapsamı içinde tutmanıza olanak tanır.

Genel olarak ActionFilters, çapraz-kesme endişeleri için kullanılır - uygulamada nerede olduklarına bakılmaksızın, birçok eylem yöntemi için çalıştırmak istediğiniz bir şey. Dolayısıyla, modelinizin sanitizasyon mantığı pek çok kontrolör ve eylem için geçerli değilse veya çok genel değilse (ki bu belki de sizin yaklaşımınız muhtemelen iyidir), bunu filtrelerden ve kontrol cihazlarınızdan çıkarmak isteyebilirsiniz. Eğer geniş bir şekilde uygulanabilecek bir şeyse, bir ActionFilter iyi.

+0

Kesinlikle sizin noktanızı görüyorum ama sanitizasyon çok fazla bir CCC ve kontrolörler ve eylem yöntemleri arasında kullanılacaktır. –

6

Burada, MVC v1 için var bu v2 içinde değişmez umut: Eğer OnActionExecuting bunu yapmak istiyorum neden

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

görmüyorum, ama mutlaka sen eğer, orada bunu, ve OnActionExecuted'in ortaya çıkan Modeli düzeltmek zorunda olduğu bazı bayrağı (özel alan) ayarlayın. Ancak, ikincisi kullanmak zorunda kalacaksınız, ancak .Result'u atamanız dışında - bu durumda eyleminiz hiç çağrılmayacak ve atanan sonuç kullanılacaktır.

+0

Model OnActionExecuting (örneğin, eylemi yürütür önce) erişmeye çalışıyorum, bu durumda Model her zaman null döndürür .... –

+0

Daha açık olmalıydım - neden yapmak zorundayım (gerekir) OnActionExecuting olduğunu Bu yüzden hala ValidateInput filtresini çalıştırabilirim (ve bunu kapatmak zorunda kalmazsınız!). Özelliklerim bu noktada HTML içeriyorsa, tehlikeli olarak işaretlenecek ve filtre başarısız olacaktır (daha iyi bir terim için). Bu ikinci filtreye ulaşmadan önce verilerin güncellenmesi gerekiyor, bu nedenle OnActionExecuted çok geç ... –

2

BTW, MVC 3 & 4 için:

filterContext.Controller.ViewData.Model