C# 关于如何使用MVC和ViewModels

C# 关于如何使用MVC和ViewModels,c#,asp.net-mvc-4,razor,viewmodel,C#,Asp.net Mvc 4,Razor,Viewmodel,我有一个模型POCO,它只存储用户的常用信息,用于在其他地方提交和预填充表单 我有ViewModels(这是正确的术语吗?),它有时通过从XML配置收集信息来填充DropDownList 我将所有这些类组合成一个超类,然后传递回页面,这样我就可以使用razor语法来预填充表单数据和表单元素 我这样做对吗?这些东西应该是这样使用的吗?从webforms的背景来看,MVC做最简单的事情似乎变得非常复杂。诚然,分离关注点和缩短代码使其更易于维护 欢迎提供一般性建议!谢谢 2015年3月10日编辑: 下

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

我有ViewModels(这是正确的术语吗?),它有时通过从XML配置收集信息来填充DropDownList

我将所有这些类组合成一个超类,然后传递回页面,这样我就可以使用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"))
//模型
公共类FormData
{ 
公共int PersonID{get;set;}
公共字符串ItemName{get;set;}
}
公共类表单元素
{
公共IEnumerable getSelectList(字符串DropDownList)
{
//…使用linq从XML配置获取selectlist
返回查询;
}
}
公共类FormViewBag
{
公众取景袋
{
DataOnForm=新FormData();
ElemOnFOrm=新的FormElements();
}
public FormData DataOnForm{get;set;}
public FormElements ElemOnForm{get;set;}
}
//控制器方法
[HttpGet]
公共行动结果索引()
{
FormViewBag ViewBagOnForm=新FormViewBag();
返回视图(ViewBagOnForm);
}
//CSHTML
@Html.DropDownListFor(m=>m.FormData.ItemName,Model.FormElements.getSelectList(“FavoriteRedStappers”))
我知道这段代码可能有点离谱,完全被误导了,但我想找出原因。
如您所见,我假设当您将视图绑定到模型时,它基本上是一个您自定义的对象,而不是直接使用ViewBag。

在FormViewBag的构造函数中创建新对象可能是不必要的,但请告诉我一些替代方法。

您的ViewModel应该是传递回页面的唯一对象。ViewModel可能包含您的模型POCO以及您可能需要使用的其他对象,例如用于填充下拉列表的数据。页面应该绑定到ViewModel类,这将使您能够使用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;
}
公共类MyViewModel
{
公共int PersonID{get;set;}
公共字符串ItemName{get;set;}
公共IEnumerable selectListItems{get;set;}
}
//控制器方法
[HttpGet]
公共行动结果索引()
{
MyViewModel模型=新的MyViewModel();
model.PersonID=0;
model.ItemName=string.Empty;
model.selectListItems=getSelectListItems();
返回视图(模型);
}
受保护的IEnumerable getSelectListItems()
{
//…使用linq从XML配置获取selectlist
返回查询;
}

尝试发布一些代码。如果你有很多代码需要检查,试着说出来是不可能的,因为你确实很含糊,而且用的术语很可能是不正确的。你最好的选择是展示你的意思的例子。谢谢,所以看起来我的思路是对的,只是在使用额外的formdata/formmodel类使其更加复杂方面做了太多的工作。