Как использовать Base ViewModel в Asp.net MVC 2 - PullRequest
9 голосов
/ 01 мая 2010

Когда я знакомлюсь с Asp.Net MVC, я использую MVC 2, я заметил использование класса BaseViewData в проекте Kigg, который я не уверен, как реализовать.

Я хочу, чтобы у каждой из моих ViewModels были доступны определенные значения. На ум приходит использование интерфейса, но мне интересно, какова лучшая практика и как Кигг это делает?

Kigg

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

В моем приложении WebForms я использую BasePage, который наследуется от System.Web.UI.Page.
Итак, в моем проекте 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, как мне убедиться, что каждый из моих ViewModel, который наследуется от BaseViewModel, имеет свойство SiteId?

Какую наилучшую практику, образцы или образцы я должен использовать?

1 Ответ

13 голосов
/ 01 мая 2010

Подход, который я выбрал бы, - это также использовать базовый контроллер и использовать переопределение 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 = ...
             }
        }
    }
}
...