MVC 是通過路由定位到對應的Action進行頁面顯示,那如何将背景的資料傳遞到前端的cshtml頁面呢?如下我們來看幾種傳值方式。
ViewBag,ViewData,TempData,Model 主要有這四種方式。
1.ViewBag 是動态類型dynamic,可以了解為往對象中設定任意屬性, 有點類似js中的對象,使用很簡單,如下就可以添加屬性并指派。
//後端指派
ViewBag.Name = "ankeyliu";
@*前端取值,@相對于VUE中的{} 輸出資料*@
@ViewBag.Name
2.ViewData 對象是ViewDataDictionary 類型,從類型中可以看出使用方式應該是類似鍵值對,指派方式如下:
//向ViewData中添加鍵值對
ViewData["Name"] = "ankeyliu";
@*前端取值,@相對于VUE中的{} 輸出資料*@
@ViewData["Name"]
@ViewBag.Name
也可以通過ViewBag進行取值,說明兩個類型引用的對象位址為同一位址。
ViewBag 和ViewData都是存放一些不重要的資料,什麼是不重要的資料呢?例如在新聞頁面中,标題和内容都是重要資料,旁邊的廣告不是重要資料,可以放在這兩個對象中。
3.TempData 是一個Session類型,指派後可以在其它頁面頁面中讀取,但隻能讀取一次就被清空了,使用方式于ViewData一緻為鍵值對類型。
4.Model 對象類型,MVC支援将對象通過View()方法傳遞到前端頁面,前端頁面有2種類型頁面即(強類型和弱類型)。
後端action中傳回一個對象
return View(new Models.Student()
{
Id = 1,
Name = "ankeyliu",
Age = 10
});
1. 強類型頁面,強類型頁面可以了解為頁面中支援文法提示,需要在頁面中顯示指定需要使用的資料對象模型是什麼。
如下指定為Student類型,使用的使小寫的model進行指定,輸出時使用大寫的Model進行資料輸出
@model ASP.NET_MVC基礎_2.Models.Student
@{
ViewBag.Title = "ShowData";
}
<h2>ShowData</h2>
@Model.Id
@Model.Name
@Model.Age
如果将對象屬性寫錯了,則會有錯誤提示,可以使錯誤在開發時發現。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SM1Y2M1EmMlhDZ2UjYyETOlJmYmJWMzQWZkNWOxczNy8CXwMzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.png)
2.弱類型頁面即頁面支援錯誤提示,在頁面中不進行model類型指定,在輸入錯誤時,編譯器不進行提示,錯誤隻能在運作時發現。
View()方法有多個重載,我們常用有如下幾種我們簡單學習下
view 可以單獨建立不一定要有對應的action
1.View(),當不傳參數時,則傳回與控制器同名的View頁面,且不傳任何參數
2.View(string viewName),顯示指定一個View頁面的名稱, 可以顯示指定的頁面,可以使用帶action的頁面,也可以指定不帶action的頁面
3.View(string viewName,string masterName),顯示指定一個View頁面名稱,和母版布局頁面,可有将頁面換一個母版頁進行顯示。
前端頁面送出資料主要有兩種方式,即Get請求和Post請求,我們都比較熟悉。
get通過url的參數将資料送出到控制器中。
post通過表單将資料送出到控制器中。
MVC支援資料驗證功能,需要在對象上加入驗證屬性
using System.ComponentModel.DataAnnotations;
如下添加一個viewmodel類進行登陸頁面制作。
public class LoginViewModel
{
[Required(ErrorMessage ="請填寫郵箱"),StringLength(50,ErrorMessage ="長度超出",MinimumLength =10)]
[EmailAddress(ErrorMessage ="郵箱格式不正确")]
[Display(Name ="郵箱")]
public string Email { get; set; }
[DataType(dataType: DataType.Password)]
[Display(Name = "密碼")]
[Required, MinLength(6)]
public string Password { get; set; }
}
2.添加控制器
我們一般會使用一對控制器,一個為Get請求擷取表單頁面,一個為Post請求送出表單資料存儲到資料庫中,這裡添加的是空的控制器。
[HttpGet]
public ActionResult Login()
{
return View();
}
[HttpPost]
public ActionResult Login(Models.LoginViewModel model)
{
return Content("Post");
}
3.添加視圖頁面
其實登入頁面比較類似于資料建立,我們使用create進行改造。主要需要引用腳本庫,這樣會自動添加驗證的腳步檔案。
@model ASP.NET_MVC基礎_2.Models.LoginViewModel
@{
ViewBag.Title = "Login";
}
<h2>Login</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>LoginViewModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Email, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Email, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
<script src="~/Scripts/jquery-3.4.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
[HttpGet]
public ActionResult Login()
{
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(Models.LoginViewModel model)
{
if (ModelState.IsValid)
{
if (model.Email == "[email protected]" && model.Password == "123456")
return View();
else
{
ModelState.AddModelError(key: "", errorMessage: "賬号密碼錯誤");
return View(model);
}
}
ModelState.AddModelError(key: "", errorMessage: "資料填寫有誤");
return View(model);
}