天天看點

MVC 前背景傳值

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      

如果将對象屬性寫錯了,則會有錯誤提示,可以使錯誤在開發時發現。

MVC 前背景傳值

 2.弱類型頁面即頁面支援錯誤提示,在頁面中不進行model類型指定,在輸入錯誤時,編譯器不進行提示,錯誤隻能在運作時發現。

MVC 前背景傳值

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.添加視圖頁面

MVC 前背景傳值

 其實登入頁面比較類似于資料建立,我們使用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);
        }      

繼續閱讀