【问题标题】:How to use a Base ViewModel in Asp.net MVC 2如何在 Asp.net MVC 2 中使用基本 ViewModel
【发布时间】:2011-02-14 15:00:55
【问题描述】:

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

我希望我的每个 ViewModel 都有特定的可用值。我想到了使用 iterface,但我想知道最佳实践是什么以及 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 属性?

我应该使用的最佳实践、示例或模式是什么?

【问题讨论】:

    标签: asp.net-mvc-2 viewmodel


    【解决方案1】:

    我将采用的方法是使用基本控制器,并使用 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 = ...
                 }
            }
        }
    }
    

    【讨论】:

    • 您必须强制转换过滤器上下文才能像这样使用它:((ViewResult)filterContext.Result).ViewData.Model
    • 查看我的代码,我实际上将结果保存在使用as 转换为ViewResult 的局部变量中,然后检查是否为null。
    猜你喜欢
    • 2013-12-17
    • 2011-01-29
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2011-10-12
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多