关于如何使用 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;
}
我有模型 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;
}