ASP.NET MVC傳遞Model到視圖的多種方式總結

来源:https://www.cnblogs.com/supersnowyao/archive/2018/01/17/8302554.html
-Advertisement-
Play Games

有多種方式可以將數據傳遞到視圖,如下所示: ViewData ViewBag PartialView TempData ViewModel Tuple 場景: 在視圖頁面,下拉框選擇課程觸發事件,分別顯示老師課程表、學生上課表,如圖: 相關的Model: 一、使用ViewData傳遞多個Model ...


     有多種方式可以將數據傳遞到視圖,如下所示:

  • ViewData
  • ViewBag
  • PartialView
  • TempData
  • ViewModel
  • Tuple

場景:

     在視圖頁面,下拉框選擇課程觸發事件,分別顯示老師課程表、學生上課表,如圖:

    

     相關的Model:

 1     public class Course
 2     {
 3         public int Id { get; set; }
 4         public string Name { get; set; }
 5     }
 6 
 7     public class Teacher
 8     {
 9         public int Id { get; set; }
10         public string Name { get; set; }
11         public List<Course> Courses { get; set; }
12     }
13 
14     public class Student
15     {
16         public int Id { get; set; }
17         public string Name { get; set; }
18         public List<Course> Courses { get; set; }
19     }

 

 一、使用ViewData傳遞多個Model

 □ HomeController

1         public ActionResult Index()
2         {
3             ViewData["Courses"] = _repository.GetCourses();
4             ViewData["Students"] = _repository.GetStudents();
5             ViewData["Teachers"] = _repository.GetTeachers();
6             return View();
7         } 

 □ Home/Index.cshtml

 1 @using MvcApplication1.Models
 2 @using System.Web.Helpers;
 3 @{   
 4     Layout = null;
 5 }
 6 
 7 <!DOCTYPE html>
 8 <html>
 9 <head>
10     <meta name="viewport" content="width=device-width" />
11     <title>ViewDataDemo</title>
12     <script src="~/Scripts/jquery-1.8.2.js"></script>
13     <script type="text/javascript">
14         $(function () {
15             //隱藏
16             $('#students').hide();
17             $('#teachers').hide();
18 
19             //點擊課程下拉框           
20             $('#sel').change(function() {
21                 selectedCourseName = $('#sel').val().trim();
22                 if (selectedCourseName == "--選擇課程--") {
23                     $('#students').hide();
24                     $('#teachers').hide();
25                 } else {
26                     getTeacherTable();
27                     getStudentTable();
28                     $('#students').show();
29                     $('#teachers').show();
30                 }
31             });
32         });
33 
34         var selectedCourseName;
35         //創建老師課程表
36         function getTeacherTable() {
37             $('#teachersTable').empty();
38             $('#teachersTable').append("<table id='tblTeachers'><tr><th>編號</th><th>姓名</th></tr></table>");
39             //把所有老師轉換成json格式
40             var teachers = @Html.Raw(Json.Encode(ViewData["Teachers"]));
41             for (var i = 0; i < teachers.length; i++) {
42                 var courses = teachers[i].Courses;
43                 for (var j = 0; j < courses.length; j++) {
44                     if (courses[j].Name == selectedCourseName) {
45                         $('#tblTeachers').append("<tr><td>"+courses[i].Id+"</td><td>"+courses[i].Name+"</td></tr>");
46                     }
47                 }
48             }
49         }
50 
51         //創建學生上課表
52         function getStudentTable() {
53             $('#studentsTable').empty();
54             $('#studentsTable').append("<table id='tblStudents'><tr><th>編號</th><th>姓名</th></tr></table>");
55             var students = @Html.Raw(Json.Encode(ViewData["Students"]));
56             for (var i = 0; i < students.length; i++) {
57                 var courses = students[i].Courses;
58                 for (var j = 0; j < courses.length; j++) {
59                     if (courses[j].Name == selectedCourseName) {
60                         $('#tblStudents').append("<tr><td>"+courses[j].Id+"</td><td>"+courses[j].Name+"</td></tr>");
61                     }
62                 }
63             }
64         }
65     </script>
66 </head>
67 <body>
68     <div>
69         <table>
70             <tr>
71                 <td><h3>選擇課程</h3></td>
72                 <td>
73                     <select id="sel">
74                         <option>--選擇課程--</option>
75                         @foreach (var course in ViewData["Courses"] as List<Course>)
76                         {
77                             <option>@course.Name</option>
78                         }
79                     </select>
80                 </td>
81             </tr>
82         </table>
83     </div>
84     <div id="teachers">
85         <h4>老師課程表</h4>
86         <div id="teachersTable"></div>
87     </div>
88     <div id="students">
89         <h4>學生上課表</h4>
90         <div id="studentsTable"></div>
91     </div>
92 </body>
93 </html>

 @Html.Raw(Json.Encode(ViewData["Students"]))是把Model轉換成json字元串,需要用到System.Web.Helpers,把此類庫引用到項目,並且必須設置"複製到本地屬性"為true,否則報錯。

 

 

二、使用ViewBag傳遞多個Model

 □ HomeController

1 public ActionResult ViewBagDemo()
2 {
3     ViewBag.Courses = _repository.GetCourses();
4     ViewBag.Students = _repository.GetStudents();
5     ViewBag.Teachers = _repository.GetTeachers();
6     return View();
7 } 

 □ Home/ViewBagDemo.cshtml

下拉框遍歷課程改成:
@foreach (var course in ViewBag.Courses)

getTeacherTable()方法中改成:
var teachers = @Html.Raw(Json.Encode(ViewBag.Teachers));

getStudentTable()方法中改成:
var students = @Html.Raw(Json.Encode(ViewBag.Students));

 

三、使用部分視圖傳遞多個Model

 □ HomeController

 1 public ActionResult PartialViewDemo()
 2 {
 3     List<Course> courses = _repository.GetCourses();
 4     return View(courses);
 5 }
 6 
 7 public ActionResult StudentsToPVDemo(string courseName)
 8 {
 9     IEnumerable<Course> courses = _repository.GetCourses();
10     var selectedCourseId = (from c in courses
11                             where c.Name == courseName
12                             select c.Id).FirstOrDefault();
13     IEnumerable<Student> students = _repository.GetStudents();
14     var studentsInCourse = students.Where(s => s.Courses.Any(c => c.Id == selectedCourseId)).ToList();
15     return PartialView("StudentPV", studentsInCourse);
16 }
17 
18 public ActionResult TeachersToPVDemo(string courseName)
19 {
20     IEnumerable<Course> courses = _repository.GetCourses();
21     var selectedCourseId = (from c in courses
22                             where c.Name == courseName
23                             select c.Id).FirstOrDefault();
24     IEnumerable<Teacher> teachers = _repository.GetTeachers();
25     var teachersForCourse = teachers.Where(t => t.Courses.Any(c => c.Id == selectedCourseId)).ToList();
26     return PartialView("TeacherPV", teachersForCourse);
27 } 

 □ Home/PartialViewDemo.cshmtl

 1 @model IEnumerable<MvcApplication1.Models.Course>
 2 @{
 3     Layout = null;
 4 }
 5 <!DOCTYPE html>
 6 <html>
 7 <head>
 8     <meta name="viewport" content="width=device-width" />
 9     <title>PatialViewDemo</title>
10     <script src="~/Scripts/jquery-1.8.2.js"></script>
11     <script type="text/javascript">
12         $(function () {
13             //隱藏
14             $('#students').hide();
15             $('#teachers').hide();
16 
17             //點擊課程下拉框           
18             $('#sel').change(function() {
19                 selectedCourseName = $('#sel').val().trim();
20                 if (selectedCourseName == "--選擇課程--") {
21                     $('#students').hide();
22                     $('#teachers').hide();
23                 } else {
24                     getTeacherTable();
25                     getStudentTable();
26                     $('#students').show();
27                     $('#teachers').show();
28                 }
29             });
30         });
31 
32         var selectedCourseName;
33         //創建老師課程表
34         function getTeacherTable() {
35             $.ajax({
36                 url: "@Url.Action("TeachersToPVDemo","Home")",
37                 type: 'Get',
38                 data: { courseName: selectedCourseName },
39                 success: function(data) {
40                     $('#teachersTable').empty().append(data);
41                 },
42                 error: function() {
43                     alert("sth wrong");
44                 }
45             });
46         }
47 
48         //創建學生上課表
49         function getStudentTable() {
50             $.ajax({
51                 url: "@Url.Action("StudentsToPVDemo","Home")",
52                 type: 'Get',
53                 data: { courseName: selectedCourseName },
54                 success: function (data) {
55                     $('#studentsTable').empty().append(data);
56                 },
57                 error: function () {
58                     alert("sth wrong");
59                 }
60             });
61         }
62     </script>
63 </head>
64 <body>
65     <div>
66         <table>
67             <tr>
68                 <td><h3>選擇課程</h3></td>
69                 <td>
70                     <select id="sel">
71                         <option>--選擇課程--</option>
72                         @foreach (var course in Model)
73                         {
74                             <option>@course.Name</option
75                         }
76                     </select>
77                 </td>
78             </tr>
79         </table>
80     </div>
81     <div id="teachers">
82         <h4>老師課程表</h4>
83         <div id="teachersTable"></div>
84     </div>
85     <div id="students">
86         <h4>學生上課表</h4>
87         <div id="studentsTable"></div>
88     </div>
89 </body>
90 </html>

 □ TeacherPV.cshtml與StudentPV.cshtml

 1 @model IEnumerable<MvcApplication1.Models.Teacher>
 2 <table id="tblTeacherDetail">
 3     <tr>
 4         <th>編號</th>
 5         <th>名稱</th>
 6     </tr>
 7     @foreach (var item in Model)
 8     {
 9         <tr>
1

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 來源http://blog.csdn.net/u010705091/article/details/75212724 echarts折線圖的數據視圖樣式重寫 在echarts.js中,點擊折線圖的數據試圖按鈕,會以表格table的形式展示折線圖中的數據,但是此時的table格式比較亂。如下圖: 所以 ...
  • 上篇文章已經封裝好了類庫,現在繼續實現功能,在ABPZero框架的基礎上來實現一個完整的功能。 Redis緩存 編寫功能前先在本機安裝好Redis,需要用到Redis做緩存,以下分享2個Windows安裝Redis的教程 博客園:http://www.cnblogs.com/mzws/p/redis ...
  • ( 需註意程度:紅>粗體>下劃線,藍色:我的疑問 ) 老師的引言 [師]對待一種新語言的關註點 數據類型定義(python不用定義) 語法 JAVA兩大優勢 面相對象:比C++簡單 跨平臺 開源:造就了很多免費的東西 每個button其實就是類的實例 找工作一定要有一技之長 面試內容: 大公司:基礎 ...
  • 盈透證券(Interactive Brokers), 簡稱IB, 全球知名的互聯網券商,在IB 開立一個賬戶即可在其平臺交易全球多種金融產品(股票,期貨,外匯。。。) 中國很多小型的互聯網券商(包括一些初創的小型的金融科技公司)大多都(不是全部)選擇IB作為美股下游券商(通俗點講就是:美股下單全都走 ...
  • ASP .Net Core 的預設埠是5000,如果想在同一臺伺服器上運行多個實例,就不能都監聽5000埠了,需要每一個實例都監聽不同的埠。當然,如果您正在使用IIS或者Jexus來托管,可以不用特意修改埠即可正常運行多個實例。 ...
  • 分享使人快樂,遇到的坑通過博文分享給大家解決辦法使更多的人少浪費寶貴的時間,於是我決定寫下了這篇博文; 公司最近上了一臺阿裡雲伺服器,我部署完系統後發現郵件發送不了,啊,怎麼會發不了郵件呢?於是找原因發現是阿裡雲伺服器把郵件的預設25埠給禁用掉了為的是不讓郵件泛濫, 好吧,於是我想怎麼去解封25端 ...
  • 知識管理方法論解決的是效率和效果的問題,其實沒有方法論的時候,足夠的專註和努力也是可以的,許三多就是這方面的典型代表,他幾乎沒有什麼技巧性的方法,完全是靠執著和努力,這種"傻氣"有一個中肯的名字叫做"鈍感力".方法論並不意味著能夠"空手套白狼",其出發點並不是投機取巧的心理,而是一種自我調整過程中摸 ...
  • 1、首先,到微軟官網下載web平臺安裝程式: https://www.microsoft.com/web/downloads/ 2、安裝好後,會在IIS里有這個圖標: 3、雙擊這個圖標:安裝 4、安裝完成後,會在IIS中出現: 5、右擊這個Server Farms然後 Create Server F ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...