关于如何使用 MVC 和 ViewModels

Regarding how MVC and ViewModels are used

我有模型 POCO,它只存储来自用户的常用信息,用于在其他地方提交和预填充表单。

我有 ViewModels(这是正确的术语吗?)填充下拉列表,有时通过从 XML 配置收集信息。

我将所有这些 类 合并到一个传递回页面的超类中,这样我就可以使用 razor 语法来预填充表单数据和表单元素。

我这样做正确吗?这些东西应该这样使用吗?来自 webforms 的背景,似乎 MVC 做最简单的事情真的很复杂。诚然,分离关注点和缩短代码使其更易于维护。

欢迎任何一般性建议!谢谢!

编辑 2015 年 3 月 10 日: 下面是一些代码来说明我的意思:

//Models
public class FormData
{ 
    public int PersonID { get; set; }
    public string ItemName { get; set; }
}

public class FormElements
{
    public IEnumerable<SelectListItem> getSelectList (string DropdownListDesired)
    {
        //... get selectlist from XML config with linq
        return query;
    }
}

public class FormViewBag
{
    public FormViewBag
    {
        DataOnForm = new FormData();
        ElemOnFOrm = new FormElements();
    }
    public FormData DataOnForm { get; set; }
    public FormElements ElemOnForm { get; set; }
}

//Controller Method
[HttpGet]
public ActionResult Index()
{
    FormViewBag ViewBagOnForm = new FormViewBag();
    return View(ViewBagOnForm);
}

//CSHTML
@Html.DropDownListFor(m => m.FormData.ItemName, Model.FormElements.getSelectList("FavoriteRedStaplers"))

我知道这段代码可能偏离了方向并且完全被误导了,但我想找出原因。
如您所见,我假设当您将视图绑定到模型时,它基本上是您自定义的一个对象,而不是直接使用 ViewBag。
在 FormViewBag 的构造函数中新建对象可能是不必要的,但让我知道一些替代方法。

您的 ViewModel 应该是传回页面的唯一对象。 ViewModel 可能包含您的模型 POCO 以及您可能需要使用的其他对象,例如用于填充下拉列表的数据。该页面应绑定到 ViewModel class,这将使您能够使用 Razor Intellisense。

编辑 2015/03/10
我喜欢保持简单。看起来您在尝试使所有内容都通用化方面走得太远了。

public class MyViewModel
{
    public int PersonID { get; set; }
    public string ItemName { get; set; }
    public IEnumerable<SelectListItem> selectListItems { get; set; }
}

//Controller Method
[HttpGet]
public ActionResult Index()
{
    MyViewModel model = new MyViewModel();
    model.PersonID = 0;
    model.ItemName = string.Empty;
    model.selectListItems = getSelectListItems();
    return View(model);
}

protected IEnumerable<SelectListItem> getSelectListItems ()
{
    //... get selectlist from XML config with linq
    return query;
}