把ContosoUniversity例子过了一遍,好象还是有很多东西未能理解,决定自己随便加个功能看可以自己完成不....

从github的例子中clone下来ContosoUniversity项目,使用CodeFirst进行迁移后就可以得到一个正常运作的例子。

  增加的课程计划 StudentCoursePlan.cs

  1. public partial class StudentCoursePlan
  2. {
  3. public int Id { get; set; }
  4. public int CourseId { get; set; }
  5. public int StudentId { get; set; }
  6. public Student Student { get; set; }
  7. public Course Course { set; get; }
  8. }

  在SchoolContext.cs中加入定义

  1. public DbSet<StudentCoursePlan> StudentCoursePlan { get; set; }

增加在列出学生列表时选择指定学生,可为其增加自己选择选修课程,并计算已获取多少学分功能

  在Student目录下的Index.cshtml文件添加一个按钮,按下后可以弹出一个可选定的课程列表

  1. <td>
  2. <a asp-action="Edit" asp-route-id="@item.ID">Edit</a> |
  3. <a asp-action="Details" asp-route-id="@item.ID">Details</a> |
  4. <a asp-action="Delete" asp-route-id="@item.ID">Delete</a> |
  5. <a asp-action="Plan" asp-route-id="@item.ID">Plan</a>
  6. </td>

  在Students.cs中增加对StudentCoursePlan的关联

  1. public ICollection<StudentCoursePlan> StudentCoursePlan { get; set; }

  在StudentsController.cs中增加Plan的Get动作

  1. public async Task<IActionResult> Plan(int? id)
  2. {
  3. if (id == null)
  4. {
  5. return NotFound();
  6. }
  7. var student = await _context.Students
  8. .Include(s => s.StudentCoursePlan)
  9. .ThenInclude(e => e.Course)
  10. .Include(e => e.Enrollments)
  11. .ThenInclude(e => e.Course)
  12. .AsNoTracking()
  13. .SingleOrDefaultAsync(m => m.ID == id);
  14. if (student == null)
  15. {
  16. return NotFound();
  17. }
  18. PopulatePlanedCourse(student);
  19. return View(student);
  20. }
  1. private void PopulatePlanedCourse(Student student)
  2. {
  3. List<StudentCoursePlanShowData> StudentCourseShow = new List<StudentCoursePlanShowData>();
  4. var selectedCourse = student.StudentCoursePlan.Select(s => s.Course);
  5. var grade = "";
  6. int? takedCredits = null;
  7. int? sumCredits = null;
  8. foreach (var course in selectedCourse)
  9. {
  10. if (course.Enrollments != null)
  11. {
  12. grade = student.Enrollments.Where(i => i.CourseID == course.CourseID).SingleOrDefault().Grade.ToString();
  13. takedCredits = course.Credits / * ( - (int)student.Enrollments.Where(i => i.CourseID == course.CourseID).SingleOrDefault().Grade);
  14. sumCredits = (sumCredits ?? ) + takedCredits;
  15. }
  16. else
  17. {
  18. grade = "";
  19. takedCredits = null;
  20. }
  21. StudentCourseShow.Add(new StudentCoursePlanShowData
  22. {
  23. CourseID = course.CourseID,
  24. Title = course.Title,
  25. Grade = grade,
  26. TakedCredits = takedCredits
  27. });
  28. }
  29. ViewData["StudentCourseShow"] = StudentCourseShow;
  30. ViewData["showNoData"] = StudentCourseShow.Count > ? "hide" : "alert alert-warning";
  31. ViewData["sumCredits"] = sumCredits;
  32. ViewData["studentID"] = student.ID;
  33. ViewData["UnselectedCourse"] = new List<StudentCoursePlanShowData>();
  34. }

  为了显示已选定的课程列表,在Models->SchoolViewModels目录下建立StudentCoursePlanShowData.cs

  1. public class StudentCoursePlanShowData
  2. {
  3. public int CourseID { get; set; }
  4. public string Title { get; set; }
  5. public string Grade { get; set; }
  6. public int? TakedCredits { get; set; }
  7. }

  Plan.cshtml

  1. @model ContosoUniversity.Models.Student
  2. @using ContosoUniversity.Models.SchoolViewModels;
  3. @{
  4. ViewData["Title"] = "Student Course Plan";
  5. }
  6.  
  7. <h2>The course that you ordered ... </h2>
  8.  
  9. <div>
  10. <h4>Student</h4>
  11. <hr />
  12. <p>Full Name : @Html.DisplayFor(model => model.FullName)</p>
  13. <span class="badge badge-info">Course List</span>
  14. <div class="@ViewData["showNoData"]">--没有数据--</div>
  15. <input type="hidden" value=@Html.DisplayFor(model => model.ID)>
  16. <table class="table table-bordered">
  17. @if (((List<StudentCoursePlanShowData>)ViewData["StudentCourseShow"]).Count > )
  18. {
  19. <thead class="thead-inverse">
  20. <tr>
  21. <th>CourseID</th>
  22. <th>Title</th>
  23. <th>Grade</th>
  24. <th>TakedCredits</th>
  25. </tr>
  26. </thead>
  27. }
  28. @foreach (var item in (List<StudentCoursePlanShowData>)ViewData["StudentCourseShow"])
  29. {
  30. <tr>
  31. <td>
  32. @Html.DisplayFor(ModeItem => item.CourseID)
  33. </td>
  34. <td>
  35. @Html.DisplayFor(ModelItem => item.Title)
  36. </td>
  37. <td>
  38. @Html.DisplayFor(ModelItem => item.Grade)
  39. <div>
  40.  
  41. </div>
  42. </td>
  43. <td>
  44. @Html.DisplayFor(ModelItem => item.TakedCredits)
  45. </td>
  46. </tr>
  47. }
  48. </table>
  49. @if (((List<StudentCoursePlanShowData>)ViewData["StudentCourseShow"]).Count > )
  50. {
  51. <div class="alert alert-success" role="alert">
  52. <strong>Total TookCredts:</strong>@ViewData["sumCredits"]
  53. </div>
  54. }
  55.  
  56. <div class="nav-divider">
  57. <input class="btn btn-primary" type="button" id="btnPost" value="Post Test" data-toggle="modal" data-target="#modalSelectCourse" />
  58. <a style="margin-left:20px" asp-action="Index">Back to List</a>
  59.  
  60. @Html.AntiForgeryToken()
  61. @section Scripts{
  62. @{ await Html.RenderPartialAsync("_ValidationScriptsPartial");}
  63. <script type="text/javascript" language="JavaScript">
  64. $(document).ready(function () {
  65. $("#btnPost").on('click', function () {
  66. $("#dvShowData").load('@Url.Action("GetUnselectedCourse", "Students", new { id = Model.ID })');
  67. });
  68. });
  69. </script>
  70. }
  71. </div>
  72. <!-- Modal -->
  73. <div class="modal" id="modalSelectCourse" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true">
  74. <div class="modal-dialog" role="document">
  75. <div class="modal-content">
  76. <div class="modal-header">
  77. <h5 class="modal-title" id="modalLabel">Course List</h5>
  78. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  79. <span aria-hidden="true">×</span>
  80. </button>
  81. </div>
  82. <form asp-action="Plan">
  83. <div class="modal-body">
  84. <div id="dvShowData">
  85. @{
  86. await Html.PartialAsync("resultsUnselectedCourse", Model);
  87. }
  88. </div>
  89. </div>
  90. <div class="modal-footer">
  91. <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
  92. <button type="submit" class="btn btn-primary">Save changes</button>
  93. </div>
  94. </form>
  95. </div>
  96. </div>
  97. </div>
  98.  
  99. </div>

  加粗部分的js语句调用了GetUnselectedCourse方法生成未经选定的课程列表,按下Post Test按钮时弹出部分视图resultsUnselectedCourse.cshtml来显示,部分视图代码如下:

  1. @model ContosoUniversity.Models.Student;
  2. @using ContosoUniversity.Models.SchoolViewModels;
  3. <h2>FullName:@Model.FullName</h2>
  4. <table class="table">
  5. <thead>
  6. <tr>
  7. <th>CourseID</th>
  8. <th>Title</th>
  9. <th>Credits</th>
  10. <th>Select</th>
  11. </tr>
  12. </thead>
  13. <tbody>
  14. @foreach (var course in ((List<StudentCoursePlanShowData>)ViewData["UnselectedCourse"]))
  15. {
  16. <tr>
  17. <td>@course.CourseID</td>
  18. <td>@course.Title</td>
  19. <td>@course.TakedCredits</td>
  20. <td>
  21. <input class="checkbox" type="checkbox" name="stringSelectedCourse" value="@course.CourseID" />
  22. </td>
  23. </tr>
  24. }
  25. </tbody>
  26. </table>

  列出未经选定课程的方法

  1. public async Task<IActionResult> GetUnselectedCourse(int? id)
  2. {
  3. var allCourses = _context.Courses;
  4. var viewModel = new List<StudentCoursePlanShowData>();
  5. var student = await _context.Students.Include(s => s.StudentCoursePlan).AsNoTracking().SingleOrDefaultAsync(m => m.ID == id);
  6.  
  7. if (student != null)
  8. {
  9. var studentSelectedCourse = new HashSet<int>(student.StudentCoursePlan.Select(c => c.CourseId));
  10.  
  11. foreach (var course in allCourses)
  12. {
  13. if (!studentSelectedCourse.Contains(course.CourseID))
  14. viewModel.Add(new StudentCoursePlanShowData
  15. {
  16. CourseID = course.CourseID,
  17. Title = course.Title,
  18. TakedCredits = course.Credits
  19. });
  20. }
  21. }
  22. ViewData["UnselectedCourse"] = viewModel;
  23. return PartialView("resultsUnselectedCourse", student);
  24. }

  选定了课程按下 Save Change 按钮时 激发 Plan 的Post 方法,记录到StudentCoursePlan表

  1. [HttpPost]
  2. [ValidateAntiForgeryToken]
  3. public async Task<IActionResult> Plan(int? id, string[] stringSelectedCourse)
  4. {
  5. if (id == null)
  6. { return NotFound(); }
  7. if (ModelState.IsValid)
  8. {
  9. UpdatePlanCourse(stringSelectedCourse, id ?? );
  10. try
  11. {
  12.  
  13. await _context.SaveChangesAsync();
  14. return RedirectToAction(nameof(Plan));
  15. }
  16. catch (DbUpdateException)
  17. {
  18. ModelState.AddModelError("", "更新资料失败");
  19. }
  20. }
  21. var student = await _context.Students
  22. .Include(s => s.StudentCoursePlan)
  23. .ThenInclude(e => e.Course)
  24. .Include(e => e.Enrollments)
  25. .ThenInclude(e => e.Course)
  26. .AsNoTracking()
  27. .SingleOrDefaultAsync(m => m.ID == id);
  28. PopulatePlanedCourse(student);
  29. return View(student);
  30. }
  31.  
  32. private void UpdatePlanCourse(string[] stringSelectedCourse, int studentID)
  33. {
  34. int j;
  35. foreach (var course in stringSelectedCourse)
  36. {
  37. if (!int.TryParse(course, out j))
  38. j = ;
  39. _context.Add(new StudentCoursePlan
  40. {
  41. CourseId = j,
  42. StudentId = studentID
  43. });
  44. }
  45. }

嗯,到这里就完成了,下一步看怎么完善一下它吧!

为微软ContosoUniversity例子加上学生自选课程计划的更多相关文章

  1. Imagine Cup 微软“创新杯”全球学生科技大赛

    一. 介绍 微软创新杯微博:http://blog.sina.com.cn/u/1733906825 官方站点:https://www.microsoft.com/china/msdn/student ...

  2. 【每日Scrum】第一天(4.11) TD学生助手Sprint1计划会议成果

    [每日Scrum]第一天  TD学生助手Sprint1计划会议成果 ——小组成员:刘铸辉 刘静 何晓楠 谢凤娇 胡宝月 王洪叶 初次尝试敏捷开发Scrum计划流程开发项目,有什么不对的地方还希望各位大 ...

  3. SQLSERVER教师学生成绩课程四表联合各种SQL考题

    --CREATE DATABASE EXAM_1 --GO USE EXAM_1 --判断并删除表 IF OBJECT_ID('Scores') IS NOT NULL DROP TABLE Scor ...

  4. mybatis多对多映射【学生与课程】

    1)如图 2)创建students.sql和courses.sql和middles.sql drop table middles; drop table students; drop table co ...

  5. Obtaining Directory Change Notifications(微软的例子,使用FindFirstChangeNotification,FindNextChangeNotification,FindCloseChangeNotification API函数)

    An application can monitor the contents of a directory and its subdirectories by using change notifi ...

  6. 课程计划安排 ver: 2016-12-14

    录的越多,后续肯定会涨价. <x86 从实模式到保护模式> 这本书涉及到除了汇编语言,还有一些计算机架构和操作系统方面相关的知识点. 不仅为学习高级编程语言打下了非常扎实的基础,学完C++ ...

  7. 福大软工1816 · 课程计划预报(K班)

    实践课安排 对应教学周序 时间 内容 3 09.22 业界交流讲座 6 10.13 团队选题报告答辩 7 10.20 UML设计 8 10.27 团队项目需求答辩 11 11.17 团队现场编程实战与 ...

  8. 【Deep Learning Nanodegree Foundation笔记】第 0 课:课程计划

    第一周 机器学习的类型,以及何时使用机器学习 我们将首先简单介绍线性回归和机器学习.这将让你熟悉这些领域的常用术语,你需要了解的技术进展,并了解深度学习在更大的机器学习背景中的位置. 直播:线性回归 ...

  9. JPA中映射关系详细说明(一对多,多对一,一对一、多对多)、@JoinColumn、mappedBy说明

    JPA中的映射关系 jpa中维护one to one ,one to many, many to one ,many to many 四种映射关系. 在每个关系中,双方中的一方在其表中拥有连接列.那么 ...

随机推荐

  1. Shiro的Subject和Sessoin的创建

    之前要先了解Session的来源Shiro session和Spring session一样吗? 创建Subject的位置 AbstractShiroFilter . doFilterInternal ...

  2. jq循环方法

    jq在前台使用很广泛,其中不可避免会用到循环,for循环可以,但有时不方便,下边举两个jq循环: 第一个: $.each(数组或对象,function(index,item){ //循环的逻辑代码 } ...

  3. FFmpeg多媒体文件格式探测

    FFmpeg版本:3.4 在FFmpeg中,每一种文件容器格式都对应一种AVInputFormat 结构,位于源码中libavformat文件夹中.当调用avformat_open_input的时候, ...

  4. linux查找目录下的所有文件中是否含有某个字符串 <zhuan>

    查找目录下的所有文件中是否含有某个字符串 find .|xargs grep -ri "IBM" 查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名 find .|xar ...

  5. Redis作为缓存服务器

    1.ICache的Redis实现没有放在'Framework.Cache/Logic'中.如果是以前,我会认为这样不好.我会这样做,'Framework.Cache'项目引用Redis项目或直接从Nu ...

  6. 使用tcmalloc编译出现undefined reference to `sem_init'

    tcmalloc是Google开源的一个内存管理库, 作为glibc malloc的替代品,效率大概是gclibc malloc的几倍.想在工程中用上tcmalloc非常的简单,我们采用了静态编译的方 ...

  7. UIPanel

    [UIPanel] UIPanel is a component that collects and manages all widgets underneath it. UIPanel is res ...

  8. 【BZOJ 3261】最大异或和【可持久化字典树】

    题意 给出一个长度为n的整数序列,给出m个操作.操作有两种.1,Ax表示在序列结尾增加x.2,Qlrx表示找到一个位置p满足 l<=p<=r,使得a[p] xor a[p+1]xor... ...

  9. Java核心技术-Java的基本程序设计结构

    1.一个简单的Java应用程序 public class FirstSample { public static void main(String[] args) { System.out.pring ...

  10. CloudStack + KVM + HA

    KVM高可用性CS4.2暂时没有实现 The Linux Kernel Virtual Machine (KVM) is a very popular hypervisor choice amongs ...