Asp.net mvc 3 如何为时间表设计viewmodel?
我有一个学生的时间表,这样他们可以在这周上课。 我不知道该如何构建我的ViewModel 我决定:Asp.net mvc 3 如何为时间表设计viewmodel?,asp.net-mvc-3,viewmodel,Asp.net Mvc 3,Viewmodel,我有一个学生的时间表,这样他们可以在这周上课。 我不知道该如何构建我的ViewModel 我决定: class CourseTableViewModel { CourseTableHeaderViewModel[] Headers; CourseTableRowViewModel[] Rows; } class CourseTableRowViewModel { int HourStart; CourseTableCellViewModel[] Cells; }
class CourseTableViewModel
{
CourseTableHeaderViewModel[] Headers;
CourseTableRowViewModel[] Rows;
}
class CourseTableRowViewModel
{
int HourStart;
CourseTableCellViewModel[] Cells;
}
class CourseTableHeaderViewModel
{
DateTime Date;
}
class CourseTableCellViewModel
{
CourseViewModel[] Courses;//null if no course at this time
}
但对我来说,这对我的视图模型来说似乎很沉重。也许我应该只发送CourseView模型[],然后在我的cshtml上完成所有的表/行/单元格工作
viewmodel真的应该像我的视图吗
编辑:我将以一个时间表的形式显示数据,以一周中的几天为标题,每小时显示一行。
如果一门课程需要2小时,它将占用2排。
每个课程的单元上都会有一个“参加”或“取消”按钮
PS:我知道jquery fullcalendar,但我只是想在这里学习如何构建我的viewmodel。一些view model类太轻了;CourseTableHeadService模型。正如Jon所说,您需要考虑UI将显示这些数据,但我不会将标题和行分开,而是使用一个类(最好是域)来表示您将需要的所有数据,然后vi9ew模型是这些类的列表:
public class Course {
public int Id {get; set; }
public DateTime StartTime {get; set; }
public string Name {get; set; }
. . .
. . .
}
public class CoursesViewModel {
public List<Course> Courses {get; set; }
public object SomeReferenceData {get; set; }
. . .
. . .
}
公共课{
公共int Id{get;set;}
公共日期时间开始时间{get;set;}
公共字符串名称{get;set;}
. . .
. . .
}
公共课课程视图模型{
公共列表课程{get;set;}
公共对象SomeReferenceData{get;set;}
. . .
. . .
}
根据您希望如何显示数据,您可以使用linq对课程列表进行排序,然后将其分配到模型中
但对我来说,这对我的视图模型来说似乎很沉重。也许我应该
只发送CourseView模型[],然后在我的cshtml上执行所有操作
表/行/单元格工作
构建ViewModel的方式不能依赖于视图的组织方式,否则会破坏视图和控制器之间的关注点分离。
您决定使用一种表格来显示课程的事实不会反映在ViewModel上,否则视图组织方式的更改会对控制器代码产生连锁反应
将渲染课程所需的所有信息传递给视图,然后在视图中执行显示表格所需的所有工作
在编辑模式下对视图中的数据进行转换可能会导致问题,因为模型绑定器在接收到发布的数据时未应用逆变换。如果您有此问题,请查看Mvc控件工具包中的联机转换:答案取决于您打算如何向用户显示数据以及将在那里进行编辑的UI(如果有)。从指定开始。这将迫使我在.cshtml文件中加入很多逻辑,比如linq,以便在特定的日期/小时/不,实际上是这样。正如我所说,这可以在您通过ajax将课程分配到模型或服务器端时完成。如果你想以不同的方式剪切数据,你总是会遇到这样的问题,我不会一个单元格一个单元格地加载我的时间表,在我的时间表中,我以天为一列,以小时为行,在你的解决方案中,我必须将所有逻辑“哪个课程针对哪个单元格”放到我的视图中。在您的解决方案中,视图模型中存在模型类的引用,这是一种不好的做法:只发送视图所需的内容。我使用的是razor而不是velocity,因此我不介意有一点逻辑。我知道你是在给视图提供它所需要的东西,然后让视图切断它。如果您不想在视图中使用任何逻辑,请使用Novelocity并将所有渲染器逻辑放入helper(痛苦)。或者只是承认你需要一点逻辑,你的模型不符合KISS IMHO,我们只讨论你循环中的linq语句。无论如何,祝你好运。我同意。我不会将您的视图模型拆分为适合这种级别的视图。将视图传递给您的数据并让它处理。如果以后您想将此数据显示为下拉列表或其他内容,该怎么办?您所要做的就是更改视图,而不是模型。每个视图有一个ViewModel,因此是的,我的ViewModel取决于我的视图!我构建viewmodel的方式不在我的控制器中定义,而是在我的viewmodel(或我的viewmodel工厂)中定义,控制器只处理模型对象,并调用构造函数或工厂将它们从/映射到viewmodel。“每个视图有一个viewmodel,因此是的,我的viewmodel取决于我的视图”一对一映射本身并不意味着ViewModel依赖于视图!从页面上显示内容的规范开始设计Viewmodel,然后按照说明设计控制器。最后,通过决定如何显示已决定显示的内容并将其放入ViewModel中来设计视图。如果在使用您的系统几个月后,客户说他不喜欢该表,您可以更改视图,以不同的方式显示相同的信息。@remibourgarel您现在有两个人以两种不同的方式讲述相同的事情。你对这件事做得太过火了,还担心一些不成问题的事情。你的虚拟机设计降低了投资回报率,代码赚钱,Q.E.D.让生活变得简单,当你被要求更改视图时,就这样做,只更改视图而不更改视图、虚拟机、控制器/操作等。弗朗西斯科是对的,给它所有的信息,让视图完成它的工作。@jolySoft,实际上Francesco是对的,因为在他的解决方案中,我没有将模型发送到视图。我只是从asp.NETMVC开始,我阅读了所有我认为任何代码都是错误的地方,它应该只包含显示指令,但我可能过度应用了这个原则。谢谢