我正在使用带Razor的C#MVC。
假设我有一个显示列表,下拉列表和2个文本框的视图。 是否所有这些信息都保存在一个课程中,然后传递给我?
答案 0 :(得分:1)
我无法强调使用ViewModels将数据从控制器传递到视图的重要性。正如你的问题所述,你已经这样做了,这是一个很好的开始!
所以......我就是这样做的。
public class IndexViewModel // or DetailsViewModel or whatever the Action Method is
{
public IEnumerable<Foo> Foos { get; set; }
public SelectList DropDownBox { get; set; }
public string Name { get; set; } // Textbox 1
public string Description { get; set; } // Textbox 2
}
行。所以让我们看看我做了什么。
我已经传递了View
所需的所有信息。没有更多,没有更少。只是-exact-info。
Foos
是foo
的列表,您可以循环播放该列表。 (专业提示:使用DisplayTemplates渲染自定义类型/自定义类型集合)。
我还建议传递SelectList
这是下拉内容等等。有些人不喜欢这样(这很好)。相反,他们传递了他们的项目的集合,以在下拉列表中呈现,但我个人觉得这太过于漏洞了。我们拥有ViewModels
的关键原因是我们可以测试这些东西。
最后,每个文本框都有一个属性。
总而言之,我将所有信息都放在一个ViewModel
中。此视图模型可以包含其他类(通过属性公开)。但是是的 - 你想要一个视图模型。
HTH:)
答案 1 :(得分:0)
从我完成的项目开始,我建议将所有信息保存在一个类中,但这完全取决于您使用的Idan Arye所述的数据。根据你的要求,我建议你看看msdn,它是C#的重要资源。希望这有助于
答案 2 :(得分:0)
这取决于你的模型有多大,但是你可以把它们放在一个类中
例如如果像Employee with 3一样简单,如下所示,则将其保留在1个类中。但是,如果它比这大3到4倍,并且有更复杂的数据字段,那么尝试将它们保存在单独的类中
public class EmployeeController : Controller
{
public ActionResult Index()
{
var employeeModel = new Employee
{
FirstName = "Hat",
LastName = "Soft",
Departments = new BindingList<SelectListItem>
{
new SelectListItem {Text = "Accounts", Value = "1"},
new SelectListItem {Text = "Human Resource", Value = "2"},
new SelectListItem {Text = "Operations", Value = "3"}
}
};
return View(employeeModel);
}
}
答案 3 :(得分:0)
如果我使用视图模型,也许您真正要问的是什么?
类似于...... Should I use a view model for just two objects?
使用MVC和Razor时,恕我直言视图模型通常非常适合。
归根结底,这取决于你,决定真的取决于你的模型以及其他因素。例如,如果视图所需的位最终来自模型中的不同实体,那么可以认为答案是肯定的,您应该考虑使用视图模型,因为可以根据您的视图定制单个视图模型。
基本上,视图模型可以帮助您保持视图清洁。通常考虑的主要含义是映射域实体以查看模型所需的不可避免的映射逻辑,反之亦然(例如,在GET或POST期间)。 AutoMapper是您可以用来减少映射代码的库的示例。根据我的经验,只要您的映射逻辑不是非常复杂,它就可以正常工作。
答案 4 :(得分:0)
在我看来,取决于页面的用途,如果要显示域对象的属性,在这种情况下你应该考虑为视图设置一个特殊对象(例如View Model),你的类就是域的对象类(例如用户)在某些时候你的视图模型(例如UserViewModel)。
当然,您也可以使用Value Objects / DTO来承载复合对象,因此,您必须创建对象类,这些类不是特定于域的,但仍需要通过DAL在系统中传输数据你的观点。
最后,您将始终需要一个View Model Class,它对应于域对象或自定义DTO / Value Object,以在视图中显示您的数据。
希望这有点帮助。