2009-03-12 13 views
1

MVC uygulamasındaki tüm görünümler için günlüğe kaydedilmiş Kullanıcı örneğini (veya henüz kimseye giriş yapmadıysa) sağlamak istiyorum. InvokeAction'ı geçersiz kılan ve ViewData'da kaydedilmiş kullanıcı örneğini (controllerContext.Controller.ViewData ["LoggedUser"] = xxx) sağlayan kendi ControllerActionInvoker sınıfımı başarıyla uyguladım. Sorun şu ki, kayıtlı kullanıcı örneğini tüm uygulamada geçirmek için güçlü yazılan Modeli kullanmak istiyorum. Tüm güçlü yazılan ViewData sınıfları için temel sınıf olabilecek ve aynı zamanda oturum açmış kullanıcı örneğini de sağlayan ApplicationViewDataBase sınıfına sahip olmayı düşünüyordum. Tüm Görünümlerim'de kayıtlı kullanıcı örneğine kolayca erişebildi.MS MVC - Tüm görünümlerim için global olarak güçlü bir şekilde yazılan ViewData/Model'i doldurabilir miyim?

Güçlü bir şekilde global olarak girildiğinden, ControllerActionInvoker.InvokeAction geçersiz kılma işleminde yaptığım gibi doldurulabilir mi? Ya da bir şekilde Kullanıcı Örneğimi Page.User uygulamasında sağlamak daha iyi midir? Ben Page.User kullanmak için muhtemelen daha kaygan bulabilirsiniz, ama aynı zamanda benim Kullanıcı örneği enjekte nasıl bir çözüm bulamadı ...

cevap

1

Kullanıcı HttpContext içine koymak için belki daha iyi bir yol? Global.asax içinde

protected void Application_AuthenticateRequest (object sender, EventArgs e) Bu eklenti gerekmez

0

; ASP.NET MVC'de zaten mevcut. Bakın ViewContext.HttpContext.User.Identity.Name

+0

Bence noktayı kaçırıyorsun. Uygulamaların, oturum açmış kullanıcı için uygulamaya özgü ayrıntıları depolayan özel bir kullanıcı sınıfına sahip olması yaygındır. Sorun, kimin giriş yaptığını bulamıyor, bu kullanıcı nesnesini veritabanından, ilgili tüm kodun yanıt kullanımına yetecek kadar erken yüklemesini sağlıyor. – christutty

1

Bu, gelecekteki ziyaretçilerin yararı için eski bir sorudur; bu, Denetleyiciden miras alınan ve özel kullanıcı eklemek için OnActionExecuted() yöntemini kullanan bir temel denetleyici oluşturarak yapılabilir. denetleyici eylemi ve görünüm arasındaki görünüme. Burada kapsamlı bir uygulama var: http://blog.bitdiff.com/2012/05/sharing-common-view-model-data-in.html

Bu verinin işlem yönteminizde kullanılabilir olmasını istiyorsanız, görünüm henüz mevcut olmadığından işler biraz daha karmaşık hale gelir. POST yöntemleri için

"baseView = filterContext.Controller.ViewData.Model BaseView olarak" Görüntülemeye erişmek alacak ancak ViewData.Model (https://stackoverflow.com/a/25250058/2381157 bakınız) ayarlamak üzere özel ModelBinder gerekir. Ne yazık ki bu, bağlayıcı bir şey olmadıkça model oluşturucu çağrılmadığı için küresel bir çözüm değildir.

Karşılaşılabilecek yaklaşımlardan biri, ActionData veya ActionParameters'a bir değer enjekte eden bir ActionFilter veya AttributeFilter'dir, ancak eyleminizin bu değeri görünüme aktarması gerekir.

Bu verileri oluşturulduğu görünüme enjekte etmenin temiz ve basit bir yolunu bulamadım ve kullanıcı örneğinin iş parçacığı için güvenli bir önbelleğini uygulamaya geri döndü, böylece gerektiğinde kullanıcı örneğini alabildim veritabanı sorgu ek yükü olmadan. Bu kolay olmadı, ancak çapraz istek kullanıcı durumunu korumak için başka avantajlar da vardı (genel olarak kontrolör mantığına özel kullanıcı verisi almak isteyebilirsiniz).

İlgili konular