# Model
## 物件製作
### 類別
```
public class Student
{
public string id { get; set; }
public string name { get; set; }
public int score { get; set; }
public Student()//宣告一個建構子裏面有id,name,score三項,如果沒有填入的話則會給預設值
{
id = string.Empty;
name = string.Empty;
score = 0;
}
public Student(string _id, string _name, int _score)//和上面相同,不過這個是可以直接在後面加入參數來宣告建構子
{
id = _id;
name = _name;
score = _score;
}
public override string ToString()//覆蓋Tostring這個方法
{
return $"學號:{id}, 姓名:{name}, 分數:{score}.";
}
}
```
### 結構
```
除了類別以外,另一種描述複雜資料的方式就是結構,有幾個特點:
不能被繼承 2.無須使用new來建立物件 3.屬於實值型別
結構和類別很像,都可以宣告欄位、方法、屬性等成員,結構適用在表示 "少量"資料"的強況,例如: 『System.Date.Time』結構就無需使用new關鍵字,便可以直接使用.
```
## json 序列、反序列化
序列化,它又稱串行化,.NET運行時環境用來支持用戶定義類型的流化的機制。
序列化就是把一個對象保存到一個文件或數據庫字段中去,反序列化就是在適當的時候把這個文件再轉化成原來的對象使用。
假設物件:
Student stu = new Student()
{
ID = 1,
Name = "孔子",
Age = 2000,
Sex = "男"
};
```
using System.Web.Script.Serialization;
//序列化
JavaScriptSerializer js = new JavaScriptSerializer();
string jsonData = js.Serialize(stu);//序列化
Console.WriteLine(jsonData);
//反序列化
string desJson = jsonData;
Student model = js.Deserialize<Student>(desJson);// //反序列化
string message = string.Format("ID={0},Name={1},Age={2},Sex={3}", model.ID, model.Name, model.Age, model.Sex);
```
# View
## 傳遞物件
ViewBag 物件:它和 ViewData 一樣,使用 Key / Value 存取,並能放入任何的資料,但不同的是,它能產生「動態屬性」。
TempData 物件:TempData 由字面上的意思看來,即告訴我們是「暫存」的資料,而暫存又是暫存多久?其實就是一次的請求,假定我們今天輸入網址 /Home/Index 而透過 Redirect 的方法轉向至 /Home/About ,若是用 ViewData 或 ViewBag 資料及會消失,但若透過 TempData 它能將資料傳遞至 /Home/About 供其使用,而最後返回頁面後 TempData 內的資料隨即消失,代表它的生命週期只有一次性,當使用一次我們就丟掉它。
## Razor
Razor又稱Razor Syntax,是用來將Server Side的C#程式嵌入到HTML中的標記語法
Razor中只有HTML及C#兩種元素,結合再一起就形成了Razor語法。
C#程式區塊是以@{…}包覆,裡面是一般C#程式。
Razor inline表達式是指C#變數穿插在HTML中,而Razor中預設是Html語言,若遇到@符號,表示後面接的是C#指令。
Razor會依不同的規則或符號在HTML和c#間切換。
```
@{
var greetingMessage="" //程式碼
}
<p>The greeting is: @greetingMessage</p>//inline表達式
```
## 跨網頁傳值
[https://coolmandiary.blogspot.com/2020/12/aspnet-mvcgetpostviewcontoller.html](https://coolmandiary.blogspot.com/2020/12/aspnet-mvcgetpostviewcontoller.html)
## Controller向View傳值
controller
```
viewbag.test1="test1 hello world";
viewdata["test2"]="test2 hello world";
tempdata["test3"]="test3 hello world";//可以跨action
Session["currentTime"] = DateTime.Now//可以跨action
```
view
```
@ViewBag.Test123
@ViewData["Test123"]
@TempData["tmpData"]
Session : @Session["currentTime"]
```
## View向controller傳值
使用Html.BeginForm(...)方法提交表單
```
@using(Html.BeginForm("actionName","controllerName"))
{
<div>表單內容</div>
<div>...</div>
<input type="submit" value="提交表單" />
}
```
傳統Form表單的Action屬性提交
```
<form id="postForm" action="@Url.Action("Save")" method="post">
<div>表單內容</div>
<div>...</div>
<input type="submit" value="提交表單" />
</form>
```
使用Ajax方式提交表單, Ajax.BeginForm(...)
```
@Ajax.BeginForm("actionName", new AjaxOptions { Url="",OnSuccess="",HttpMethod="get" })
{
<div>表單內容</div>
<div>...</div>
<input type="submit" value="提交表單" />
}
```
## 跳轉
Return view() 返回View
```
Return View();//返回與Action名稱一樣的view
Return View("view名稱")//本view所在文件夾和share文件夾中找
Return View("~/Views/Home/Index.cshtml")//完整路徑
```
Redirect() 重新導向到指定URL
```
return Redirect("index?page=2");
return Redirect("delete");
return Redirect("/User/Index");
```
RedirectToAction() 重新導向到特定Action
```
return RedirectToAction(nameof(action),nameof(controller));
//例如
RedirectToAction(nameof(HomeController.Login),nameof(HomeController));
```
## HTML Helper
ASP.NET MVC中可以使用HTML Helper輔助產生需要的HTML語法,進而增加專案開發的效率
### 輸出超連結
1. 一般使用
```
@Html.ActionLink("linkText","actionName")
第一個參數為想顯示的文字,第二個參數為此View預設Controller中的Action
ex: @Html.ActionLink("首頁","Index")
```
2. 第三個參數可以指定Controller名稱
```
@Html.ActionLink("linkText","actionName","ControllerName")
第三個參數可以指定Controller名稱
ex: @Html.ActionLink("首頁","Index","Home")
```
3. 第三個參數為路由的參數
```
@Html.ActionLink("linkText","actionName",RouteValues)
第三個參數為路由的參數
ex: @Html.ActionLink("關於","Aboot",new { id = 0 })
```
4. 第四個參數可以設定HTML屬性,需在關鍵字前加上@才能正確編譯,若HTML屬性含有「-」 符號必須用底線「_」代替,如data-value需改為data_value
```
@Html.ActionLink("linkText","actionName",RouteValues,htmlAttributes)
第四個參數可以設定HTML屬性,需在關鍵字前加上@才能正確編譯,若HTML屬性含有「-」 符號必須用底線「_」代替,如data-value需改為data_value
ex: @Html.ActionLink("關於","Aboot",new { id = 0 },new {@class='btn')
```
# Controller
## Action資料傳遞
TempData.Keep("key") 資料會標記刪除,所以生命周期會減少。也就是跳轉回去后,刷新頁面或是切換頁面,資料都會消失
TempData.Peek("key") 資料不會標記刪除,所以生命周期不會減少。也就是跳轉后,刷新頁面或是切換頁面,資料都不會消失
```
public class HomeController : Controller
{
public IActionResult Index()
{
ViewData["Label"] = "TOYOTA";
ViewData["Type"] = "Vios";
ViewData["cc"] = "1.5";
TempData["FN"] = TempData["file"];//取得B的TempData["file"]的值
return View();
}
public IActionResult B(){
TempData["file"] = "123";
TempData.Keep("file");//資料使用一次后就會清空
//TempData.Peek("file");//資料使用后不會清空
return View();
}
public IActionResult C()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
```
## Actionreslt類型
<table width="624">
<thead>
<tr>
<th width="155">型別</th>
<th width="272">簡介</th>
<th width="195">Controller Helper Methods</th></tr></thead>
<tbody>
<tr>
<td width="155">EmptyResult</td>
<td width="272">甚麼事都不做…</td>
<td width="195">無</td></tr>
<tr>
<td width="155">ContentResult</td>
<td width="272">回傳文字至瀏覽器,可以自行設定content-type。</td>
<td width="195">Content</td></tr>
<tr>
<td width="155">FileResult</td>
<td width="272">回傳二位元資料,例如Server上的mp3等檔案。</td>
<td width="195">File</td></tr>
<tr>
<td width="155">ViewResult</td>
<td width="272">呈現指定或是預設的View。</td>
<td width="195">View</td></tr>
<tr>
<td width="155">PartialViewResult</td>
<td width="272">呈現指定或是預設的View樣板</td>
<td width="195">PartialView</td></tr>
<tr>
<td width="155">RedirectToRouteResult</td>
<td width="272">如果產生HTTP 301、302則會重新導向到另外一個Action或是其他指定的URL、或是設定好的Router。</td>
<td width="195">
<p>RedirectToAction
RedirectToActionPermanent
RedirectToRoute
RedirectToRoutePermanent</p>
</td></tr>
<tr>
<td width="155">RedirectResult</td>
<td width="272">如果產生HTTP 301、302則會導向至另外一個URL。</td>
<td width="195">Redirect
RedirectPermanent</td></tr>
<tr>
<td width="155">JsonResult</td>
<td width="272">將.net 物件序列化成Json格式並回傳。</td>
<td width="195">Json</td></tr>
<tr>
<td width="155">JavaScriptResult</td>
<td width="272">回傳一個JavaScript的程式碼片段,通常用於Ajax裡面。</td>
<td width="195">JavaScript</td></tr>
<tr>
<td width="155">HttpUnauthorizedResult</td>
<td width="272">回傳HTTP 401 ( 未授權 )。</td>
<td width="195">None</td></tr>
<tr>
<td width="155">HttpNotFoundResult</td>
<td width="272">回傳HTTP 404。</td>
<td width="195">HttpNotFound</td></tr>
<tr>
<td width="155">HttpStatusCodeResult</td>
<td width="272">返回指定的HTTP代碼。</td>
<td width="195">無</td></tr></tbody></table>
## 連接SQL
範例
```
using MVCTest.Models;
using MySql.Data.MySqlClient;//
using System.Data.SqlClient; //mssql連綫需要
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCTest.Controllers
{
public class HomeController : Controller
{
//mysql "server=主機位置;port=3306;user id=用戶名;password=密碼;database=資料庫名稱;charset=編碼方式;"
//mssql "data source=主機位置; initial catalog = 資料庫名稱; user id = 帳號; password = 密碼";
string connString = "server=127.0.0.1;port=3306;user id=root;password=Acuteboy1215;database=mvctest;charset=utf8;";
MySqlConnection conn = new MySqlConnection();
public ActionResult Index()
{
conn.ConnectionString = connString;
if (conn.State != ConnectionState.Open)//檢查連綫狀態是否開啓,如果重複開啓會出錯
conn.Open();
//sql指令
string sql = @"INSERT INTO `City` (`Id`, `City`) VALUES
('0', '基隆市'),
('1', '臺北市'),
('2', '新北市')";
//設定Insert的cmd指令
MySqlCommand cmd = new MySqlCommand(sql, conn);
int index = cmd.ExecuteNonQuery();//執行
bool success = false;
if (index > 0)
success = true;
else
success = false;
ViewBag.Success = success;
conn.Close();
return View();
}
}
}
```