2010-05-01 12 views
9

Al familiarizarme con Asp.Net MVC, estoy usando MVC 2, he notado el uso de una clase BaseViewData en el proyecto Kigg, que no estoy seguro de cómo implementar.Cómo usar un modelo de vista base en Asp.net MVC 2

Quiero que cada uno de mis ViewModels tenga ciertos valores disponibles. El uso de una interfaz me viene a la mente, pero me pregunto cuál es la mejor práctica y cómo lo hace Kigg.

Kigg

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

En mi aplicación Web Forms Puedo usar un BasePage que hereda de System.Web.UI.Page.
Por lo tanto, en mi proyecto MVC, tengo esto:

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()) 
    { 
    } 
} 

referencia a la metodología Kigg, ¿cómo me aseguro de que cada uno de mi modelo de vista que se hereda de los BaseViewModel tienen la propiedad SiteID?

¿Cuál es la mejor práctica, muestras o patrones que debería utilizar?

Respuesta

13

El enfoque que tomaría es usar también un controlador base y usar la anulación OnActionExecuted para completar su modelo con datos comunes. Luego solo asegúrese de que sus controladores hereden de su controlador base y que sus modelos hereden del modelo 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

Vas a tener que emitir el contexto de filtro a utilizar de esta manera: '((ViewResult) filterContext.Result) .ViewData.Model' – ajbeaven

+0

En cuanto a mi código, yo en realidad guardar el resultado en una variable local lanzando a ViewResult usando 'as', luego verifique null. – tvanfosson

Cuestiones relacionadas