如何在Asp.net MVC 2中使用Base ViewModel

时间:2010-05-01 19:06:27

标签: asp.net-mvc-2 viewmodel

当我熟悉Asp.Net MVC时,我正在使用MVC 2,我注意到在Kigg项目中使用了BaseViewData类,我不确定如何实现。

我希望每个ViewModel都具有某些可用值。我想到了使用iterface,但我想知道最佳实践是什么以及Kigg是如何做到的?

Kigg

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

在我的WebForms应用程序中,我使用继承自System.Web.UI.Page的BasePage 所以,在我的MVC项目中,我有这个:

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

引用Kigg方法,如何确保从BaseViewModel继承的每个ViewModel都具有SiteId属性?

我应该使用的最佳做法,样本或模式是什么?

1 个答案:

答案 0 :(得分:13)

我将采用的方法是使用基本控制器并使用OnActionExecuted覆盖来使用公共数据填充模型。然后确保您的控制器继承自您的基本控制器,并且您的模型继承自基本模型。

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 = ...
             }
        }
    }
}