2010-05-01 3 views
9

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

Я хочу, чтобы каждая из моих моделей ViewModels имела определенные значения. Использование итерации приходит на ум, но мне интересно, что такое лучшая практика и как это делает 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 Я использую 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?

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

ответ

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

Вы должны отбрасывать контекст фильтра, чтобы использовать его как это: '((ViewResult) filterContext.Result) .ViewData.Model' – ajbeaven

+0

Глядя на мой код, я на самом деле сохранить результат в локальной переменной кастинг в ViewResult с помощью 'as', затем проверьте значение null. – tvanfosson

Смежные вопросы