实现MVC项目的最佳方式

时间:2018-04-09 18:26:30

标签: entity-framework model-view-controller viewmodel

我有一个概念性的问题,所以stackoverflow没有答案。这是我必须要做的一项运动。练习是将人们注册到大学课程的简单形式。从一开始,我在SQL Server中有两个表,主题(有两列:id和description)和schedule(有三列:id,idSubject和description)。

练习要求我开发一个带有三个字段的视图的MVC webapp:名称,电话,电子邮件,并为每个主题显示带有可用时间表的单选按钮列表。

我想使用ViewModels以避免公开模型。但是,有些问题出现在我身上......

  1. 由于我将使用ViewModel,我可以从控制器发送以查看主题和日程表列表的独特方式是使用ViewBag,不是吗?还有更好的方法吗?

  2. 我想恢复执行此LINQ的主题和相关时间表列表:

    using(var myDbContext = new subjectsEntities())
    {
        var scheduledSubjects = (from subject on myDbContext.Subjects
                                 join schedules on myDbContext.Schedules
                                    on subject.Id equals schedules.IdSubject
                                 select new { 
                                                idSubject = subject.Id,
                                                idSchedule = schedules.Id,
                                                descSubject = subject.description, 
                                                descSchedule = schedules.description 
                                 })
                                .ToList();
    }
    
  3. 但是在Models文件夹中我同时拥有Subject和Schedule类,其属性与表中的每个字段匹配(匹配名称和数据类型)。

    我认为有一种更好的方法可以通过分组来直接返回一个主题列表,其中包含一个可以作为时间表列表的属性....¿我怎么能这样做?

    非常感谢朋友!如你所见,我必须更好地理解一些概念,所以我非常感谢你的帮助。

    感谢!!!

1 个答案:

答案 0 :(得分:0)

只是扩展已经给出的更详细的回复:

  1. 简单的英语答案是您使用控制器中的linq数据实例化ViewModel,并通过在视图顶部声明@model ViewModelPath.MyViewModel将其显示为视图中定义的模型,然后返回字段使用类似@ Html.TextBoxFor(model => model.Description)......全都有例子。

  2. 我没有使用您的代码,因为它没有格式化,但ViewModel中的分组列表将如下所示:

  3. ... usings

    ...命名空间 {

      public class MyViewModel
    
      {
    
      public int Id {get; set;}
    
      public string Description {get; set;}
    
      ...
    
      public IEnumerable<groupedList> GroupedList {get; set;}
    
    
      }
    
      public class GroupedList 
    
      {
    
      public int GroupedId {get; set;}
    
      public string GroupedDescr {get; set;}
    
      ...
    
      }
    

    }