【问题标题】:Regarding how MVC and ViewModels are used [closed]关于如何使用 MVC 和 ViewModel [关闭]
【发布时间】:2015-03-09 19:32:35
【问题描述】:

我有模型 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 的构造函数中新建对象可能是不必要的,但请告诉我一些替代方案。

【问题讨论】:

  • 尝试发布一些代码。如果你有很多代码需要审查,试试codereview.stackexchange.com
  • 不可能说清楚,因为你真的很模糊,而且很可能以不正确的方式使用术语。最好的办法是举例说明你的意思。

标签: c# asp.net-mvc-4 razor viewmodel


【解决方案1】:

您的 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;
}

【讨论】:

  • 谢谢,看来我走在正确的轨道上,只是在使用额外的 formdata/formmodel 类使其变得更加复杂方面投入了太多。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多