2011-06-07 12 views
11

için görünüm model verilerini sağlamanın en zarif yolu Uygulamamda, her sayfada görüntülenebilmesi gereken bazı temel kullanıcı bilgilerine sahibim (name, profile img). Şu anda _Layout.cshtml sayfasındaki modeli ApplicationBaseModel adında bir sınıf olarak ayarladım ve uygulamadaki diğer tüm görünüm modelleri bu sınıftan miras almalı ve her eylem temel model için uygun verileri ayarlamalıdır._Layout.cshtml

Bu şekilde basit bir kalıtımın olduğunu sanmıyorum, her bir eylem yönteminde verileri geri almalı ve onu görünüm modelinde saklamalıyım. Benim düşüncemde çok zarif bir çözüm değil.

Bu sorunun çözümünde başka yollarla ilgili herhangi bir fikri olan var mı?

+0

Razor kullanıyor musunuz? – mnemosyn

+0

Evet, jilet kullanıyorum – jcvandan

+0

Boşver ... Sayfa tabanı türünü değiştirmeyi düşünüyordum (bu, jilete özgüdür), ama bu probleminizi çözmez * ve * karmaşık ... üzgünüm – mnemosyn

cevap

23

Initialize() verilerini geçersiz kılan ve ViewBag özelliğine ayarlayan bir BaseController oluşturur. Şimdi, BaseController'dan oluşturduğunuz her Denetleyiciyi türetin ve düzeninizde kullanıcı verilerinize erişmek için ViewBag özelliğini kullanın.

public class BaseController : Controller 
{ 
    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     // retireve data 
     var data = new ApplicationBaseModel(); 

     // set to viewbag 
     ViewBag.UserData = data; 
    } 
} 

Eğer ApplicationBaseModel tüm modeliniz sınıfları türetmek gerekmez Bu şekilde. Güçlü yazılan görünümler ve ek olarak kullanıcı verilerinizi ViewBag özelliği olarak kullanabilirsiniz.

+0

Güzel uzlaşma, teşekkürler. –

+0

Bu iyi bir çözüm gibi görünüyor. "BaseController.Initialize", "BaseController" dan türetilen her denetleyici için toplanacak veya "BaseController" den türetilen ilk Denetleyicide bir eylemin çağrılması üzerine yalnızca bir kez gerçekleştirilecektir. Diğer bir deyişle, 3 denetleyicim varsa - 'HomeController',' AboutController', 'AccountsController' ve bir kullanıcı sayfadaki bağlantılardan 3 denetleyiciye erişirse, 'BaseController' 3 kez veya yalnızca bir kez çalıştırılır. Uygulama havuzunun kullanım süresi geri dönüştürülene kadar kullanım süresi)? – Shiva

+0

@Shiva: Bu bir örnek yöntemdir, bu nedenle her bir Denetleyici örneğinin çağrılmasından önce her denetleyici örneğinde ve her istekte yürütülür. Uygulama havuzu yaşam döngüsü ile tanımladığınız şey statik yöntemlere uygulanır. – DanielB

3

ViewBag verilerini oluşturmak istediğiniz zamana bağlı olarak, OnActionExecuting veya OnActionExecuted işlevlerini de kullanabilirsiniz. Bu, daha uygun olabilir, çünkü bazı veriler Kontrolörün oluşturulduğu anda mevcut olmayabilir.

public class MyController : Controller 
{ 
    //Executes before every action 
    protected override void OnActionExecuting(ActionExecutedContext context) 
    { 
     //Call the method from the base class 
     base.OnActionExecuting(context); 

     //Create the ViewBag data here 
     ViewBag.XYZ = XYZ(); 
    } 

    //Executes after every action 
    protected override void OnActionExecuted(ActionExecutedContext context) 
    { 
     //Call the method from the base class 
     base.OnActionExecuted(context); 

     //Create the ViewBag data here 
     ViewBag.XYZ = XYZ(); 

    } 
} 
+1

+1 ancak verilerim nesne oluşturmada mevcut olacak – jcvandan

1

Düzenleme görünümünde veri gerektiren bölümleri parçalamak ve bunları kısmi olarak yerleştirmek başka bir seçenektir. Ardından, düzen görünümünüzden, gerekli kısmi verileriyle bu kısmi döndüren eylemlere bir Html.Action çağrısı yapın.

İlgili konular