Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何为时间表设计viewmodel?_Asp.net Mvc 3_Viewmodel - Fatal编程技术网

Asp.net mvc 3 如何为时间表设计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; }

我有一个学生的时间表,这样他们可以在这周上课。 我不知道该如何构建我的ViewModel

我决定:

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开始,我阅读了所有我认为任何代码都是错误的地方,它应该只包含显示指令,但我可能过度应用了这个原则。谢谢