2010-05-01 4 views
9

Mentre familiarizzo con Asp.Net MVC, sto usando MVC 2, ho notato l'uso di una classe BaseViewData nel progetto Kigg che non so come strumento.Come utilizzare un Base ViewModel in Asp.net MVC 2

Voglio che ciascuno dei miei ViewModels abbia determinati valori disponibili. Mi viene in mente l'uso di una trama, ma mi chiedo quale sia la migliore pratica e come fa Kigg a farlo?

Kigg

public abstract class BaseViewData 
{ 
    public string SiteTitle { get; set; } 
    // ...other properties 
} 
public class UserListViewData : BaseViewData 
{ 
    public string Title { get; set; } 
    // .. other stuff 
} 

Nella mia domanda WebForms Io uso un BasePage che eredita da System.Web.UI.Page.
Così, nel mio progetto MVC, ho questo:

public abstract class BaseViewModel 
{ 
    public int SiteId { get; set; } 
} 
public class UserViewModel : BaseViewModel 
{ 
    // Some arbitrary ViewModel 
} 
public abstract class BaseController : Controller 
{ 
    private IUserRepository _userRepository; 

    protected BaseController() 
     : this(
      new UserRepository()) 
    { 
    } 
} 

Riferimento metodologia Kigg, come faccio a fare in modo che ogni mio ViewModel che eredita dalla BaseViewModel hanno la proprietà SiteID?

Qual è la migliore pratica, campioni o modelli che dovrei usare?

risposta

13

L'approccio che vorrei adottare è quello di utilizzare anche un controller di base e utilizzare l'override OnActionExecuted per popolare il modello con dati comuni. Quindi assicurati che i controller ereditino dal tuo controller di base e che i tuoi modelli ereditino dal modello base.

public class BaseController : Controller 
{ 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     var result = filterContext.Result as ViewResult; 
     if (result != null) 
     { 
      var baseModel = result.Model as BaseViewModel; 
      if (baseModel != null) 
      { 
       baseModel.SiteID = ... 
      } 
     } 
    } 
} 
+0

Dovrete lanciare contesto filtro da utilizzare in questo modo: '((ViewResult) filterContext.Result) .ViewData.Model' – ajbeaven

+0

Guardando il mio codice, io in realtà salvare il risultato in una variabile locale lanciare su ViewResult usando 'as', quindi verificare null. – tvanfosson