本應該繼續(xù)數(shù)據(jù)庫訪問的問題進行探討,前文確實比較LOW。但本人認為:初學者需要解決的是快速了解知識路線的問題,所謂“生存問題”,所以,干脆把流程先走完。
一、頁面生成
下面這張圖在前面已經(jīng)介紹過:
?前文其實已經(jīng) “初步” 解決了數(shù)據(jù)庫讀寫操作了(可理解為 C 到 M 的雙向通道已經(jīng)完成)!剩下的問題是:
1、頁面生成:控制器根據(jù)用戶訪問需求、數(shù)據(jù)庫內(nèi)容,動態(tài)生成頁面;(C?--->? V 的)
2、頁面的數(shù)據(jù)傳送到控制器? ?(V? ---- >? C)
頁面生成包括兩大部分:
1、數(shù)據(jù)傳遞,控制器數(shù)據(jù)怎么到頁面,同時,數(shù)據(jù)類型的生存期也應該注意
2、頁面元素的動態(tài)生成:框架一般都是固定的,但內(nèi)容應該是動態(tài)生成
控制器到頁面數(shù)據(jù)可以通過 ViewBag? ?ViewData 、TempData等”動態(tài)“容器來實現(xiàn):容器表明數(shù)據(jù)很多,動態(tài)意味著數(shù)據(jù)的類型并非固定的,而是動態(tài)的,依據(jù)約定進行 ”裝卸“ 即可。
在asp.net mvc程序設(shè)計中,傳遞數(shù)據(jù)常常會用到viewdata、viewbag、tempdata,這3個對象都可以用來傳遞數(shù)據(jù),但他們在細節(jié)中有很多的不同之處。
ViewData:ViewData是一個字典集合,通過key值讀取對應的value使用方法:ViewData["myname"]="張三"
ViewBag:ViewBag是動態(tài)類型,作用和ViewData一樣,都是用來存儲信息,有一些不同的是ViewData是object類型,ViewBag是動態(tài)類型,從運行效率上來講,ViewBag高于ViewData。在實際開發(fā)中,通不只用其中一種。使用方法:ViewBag.data="張三"
TempData:跨請求數(shù)據(jù)傳遞,它的機制類似于Session對象,不同的頁面之間可以傳遞參數(shù),但TempData只保存上一次的數(shù)據(jù),當頁面再次刷新,數(shù)據(jù)消失。使用方法:TempData["myname"]="張三"
以上摘抄自網(wǎng)絡(luò)。因為不重要,直接用 ViewBag 來的簡單!
使用范例:續(xù)上文例 Index Action中添加:
?頁面也進行修改:
?運行結(jié)果:
?代碼就不貼了,就幾行,很簡單就完成數(shù)據(jù)傳遞:ViewBag 里塞進去,在 CSHTML文件里用Razor 的語法來完成動態(tài)生成頁面。
?二、改進代碼
為了簡單,先在控制器下添加一個類,該類就是對表user的描述,以下是HomeController.cs的代碼:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TestWeb.Models;
namespace TestWeb.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
DataSet set= TestMysql.Query("select * from user");
List<TestUser> list = new List<TestUser>();
foreach (DataRow row in set.Tables[0].Rows)
{
TestUser tmp = new TestUser(row["name"].ToString(),
row["psw"].ToString(),
int.Parse(row["age"].ToString()));
list.Add(tmp);
}
ViewBag.stu_list = list;
return View();
}
}
public class TestUser
{
public string name; //公用才能在頁面上調(diào)用,面向?qū)ο蠓庋b思想
public string psw;
public int age;
public TestUser(string _name, string _psw, int _age)
{
name = _name;
psw = _psw;
age = _age;
}
}
}
視圖類進行修改:Index.cshtml
@{
List<TestWeb.Controllers.TestUser> list = ViewBag.stu_list;
}
<table>
<thead> //表頭
<tr>
<th>姓名</th>
<th>密碼</th>
<th>年齡</th>
</tr>
</thead>
@foreach (TestWeb.Controllers.TestUser item in list) //C#遍歷集合
{
<tr>
<td>@item.name</td>
<td>@item.psw</td>
<td>@item.age</td>
</tr>
}
</table>
先看結(jié)果:
?這里不僅僅是由簡單數(shù)據(jù)到對象,到對象集合的傳遞問題,還涉及到兩個重要問題:頁面動態(tài)生成,以及數(shù)據(jù)類型的作用范圍
重要結(jié)論:頁面是在控制器,或者說是服務(wù)端生成的,也就是所謂的 ViewBag 的數(shù)據(jù)并非已傳送到客戶端 瀏覽器 !從ViewBag里 ”拆“ 出來的數(shù)據(jù),仍然在服務(wù)器上使用?!梢院唵蔚乩斫鉃槭褂?@ 拆出來的數(shù)據(jù)還是在服務(wù)器上使用,作用是用來 ”輔助“ 服務(wù)器生成所需要的 頁面。頁面都是html + css + js 等,動態(tài)嵌入數(shù)據(jù)和元素很麻煩,那么用 Razor 語法來實現(xiàn)吧!
頁面是控制器用 Razor 動態(tài)生成,數(shù)據(jù)類型作用范圍僅限于服務(wù)端,客戶端僅僅能夠執(zhí)行的代碼是JS(肯定不是C#)。
問題:
數(shù)據(jù)是否需要到客戶端去通過JS使用呢?——當然要,比如echarts 畫圖,就要用到數(shù)據(jù)!這個問題在后面再探討。
PS:
1、echarts 畫圖 能不能 在服務(wù)端完成?當然不行,那是一個JS ,在瀏覽器上運行的!文章來源:http://www.zghlxwxcb.cn/news/detail-623406.html
2、js能不能使用? List、類等數(shù)據(jù)類型?當然不行,難道瀏覽器上裝一個C#的代碼編譯器?文章來源地址http://www.zghlxwxcb.cn/news/detail-623406.html
到了這里,關(guān)于【ASP.NET MVC】生成頁面(6)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!