真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

7天玩轉(zhuǎn)ASP.NETMVC—第5天

目錄

  • 第 1 天

    創(chuàng)新互聯(lián)建站-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比巍山網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式巍山網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋巍山地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

  • 第 2 天

  • 第 3 天

  • 第 4 天

  • 第 5 天

  • 第 6 天

  • 第 7 天

0. 前言

歡迎來(lái)到第五天的學(xué)習(xí)。希望第一天到第四天的學(xué)習(xí),你都是開(kāi)心的。

1. Lab 22 — 增加 Footer

在這個(gè)實(shí)驗(yàn)中,我們將會(huì)向 Employee 頁(yè)面添加 Footer。本次實(shí)驗(yàn)的目標(biāo)是理解分部視圖(Partial Views)。

什么是「Partial Views」?

邏輯上講,分部視圖(Partial Views) 是一個(gè)可重用的視圖,它不會(huì)被直接顯示。它會(huì)被其它視圖所包含,然后作為該視圖的一部分來(lái)顯示。它類(lèi)似于 ASP.NET Web Forms 中的用戶控件,但是沒(méi)有后臺(tái)代碼。

第一步:為 Partial View 創(chuàng)建 ViewModel

右擊 ViewModel 文件夾,然后創(chuàng)建一個(gè)類(lèi),命名為 FooterViewModel。

public class FooterViewModel{   public string CompanyName { get; set; }   public string Year { get; set; }}

第二步:創(chuàng)建 Partial View

右擊「~/Views/Shared」文件夾,選擇 Add -> View。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

設(shè)置視圖的名稱為 Footer。選中「Create as a partial view」復(fù)選框,然后點(diǎn)擊「Add」。

注意:我們已經(jīng)在第一天的學(xué)習(xí)中談?wù)摿?Shared 文件夾。Shared 文件夾包含了視圖,這些視圖不會(huì)屬于一個(gè)特定的控制器。在 Shared 文件夾下的視圖適用于所有控制器。

第三步:在 Partial View 中顯示數(shù)據(jù)

打開(kāi) Footer.cshtml,然后放置如下代碼。

  1. @usingWebApplication1.ViewModels

  2. @modelFooterViewModel

  3. @Model.CompanyName©@Model.Year

第四步:在 Main ViewModel 中包含 Footer 數(shù)據(jù)

打開(kāi) EmployeeListViewModel 類(lèi),然后增加一個(gè)新的屬性來(lái)承載 Footer 數(shù)據(jù)。

  1. publicclassEmployeeListViewModel

  2. {

  3.    publicListEmployees{get;set;}

  4.    publicstringUserName{get;set;}

  5.    publicFooterViewModelFooterData{get;set;}//New Property

  6. }

在我們的例子中,F(xiàn)ooter 視圖將會(huì)作為 Index 視圖的一部分展示。

我們將會(huì)在 Index 視圖中向 Footer 傳輸必要數(shù)據(jù)。

Index 視圖是一個(gè) EmployeeListViewModel 的強(qiáng)類(lèi)型視圖,因此 Footer 中需要的數(shù)據(jù)都應(yīng)該被封裝在 EmployeeListViewModel 類(lèi)中。

第五步:設(shè)置 Footer 數(shù)據(jù)

打開(kāi) EmployeeController,然后在 Index 行為方法中設(shè)定 FooterData 屬性值。

public ActionResult Index(){   ...   ...    employeeListViewModel.FooterData = new FooterViewModel();    employeeListViewModel.FooterData.CompanyName = "StepByStepSchools";//Can be set to dynamic value    employeeListViewModel.FooterData.Year = DateTime.Now.Year.ToString();    return View("Index", employeeListViewModel);}

第六步:展示 Footer

打開(kāi) Index.cshtml 文件,然后在 Table 標(biāo)簽后展示 Footer 視圖。

        @{            Html.RenderPartial("Footer", Model.FooterData);        }    

第七步:執(zhí)行并測(cè)試

按下 F5。導(dǎo)航到 Index 視圖。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

Lab 22 的 Q&A

Html.Partial 是用來(lái)做什么的?

它類(lèi)似于 Html.RenderPartial,Html.Partial 用于在視圖中展示 Partial View。

它的語(yǔ)法如下。非常簡(jiǎn)單。

@Html.Partial("Footer", Model.FooterData);

兩者的區(qū)別是什么?

Html.RenderPartial 將會(huì)把 Partial View 的結(jié)果寫(xiě)入 HTTP 響應(yīng)流中,而 Html.Partial 將會(huì)以 MvcHtmlString 的格式返回結(jié)果。

什么是 MvcHtmlString,為什么 Html.Partial 返回的是 MvcHtmlString,而不是字符串?

首先讓我們理解下什么是 MvcHtmlString。

MSDN 的定義是「MvcHtmlString 代表一個(gè) HTML 編碼的字符串,這種字符串不應(yīng)該再次編碼」。

更好地理解這個(gè)定義,請(qǐng)查看下面代碼。

@{   string MyString = "My Simple String";}@MyString

它將會(huì)產(chǎn)生如下輸出。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

正如你所看見(jiàn)的,Razor 展示了所有的內(nèi)容??赡茉S多人會(huì)以為將輸出加粗的字符串,但是 Razor Html 在展示之前對(duì)內(nèi)容進(jìn)行了編碼,這就是為什么我們獲得的是純內(nèi)容,而不是加粗的字符串。

當(dāng)我們不想用 Razor 編碼時(shí),我們可以使用 MvcHtmlString。MvcHtmlString 是 Razor 的一種表示,即「字符串已經(jīng)編碼了,不再需要額外編碼」。

例如我們可以看下面的代碼。

@{   string MyString = "My Simple String";}@MvcHtmlString.Create(MyString)

它將會(huì)產(chǎn)生如下輸出。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

為什么 Html.Partial 返回的是 MvcHtmlString,而不是字符串呢?

我 們已經(jīng)理解了「Razor 將會(huì)編碼字符串,但是不會(huì)對(duì) MvcHtmlString 編碼」這一事實(shí)。如果 Partial View 內(nèi)容被認(rèn)為是像它展示的那樣的純字符串,便沒(méi)有意義。我們希望它被當(dāng)成是一個(gè) HTML 內(nèi)容,這樣我們就需要停止 Razor 編碼,因此 Partial 方法被設(shè)計(jì)為返回 MvcHtmlString。

哪個(gè)更加推崇,Html.RenderPartial 還是 Html.Partial ?

Html.RenderPartial 更被推崇,因?yàn)樗臁?/p>

什么時(shí)候運(yùn)用 Html.Partial 更好?

當(dāng)我們想在展示之前改變 Partial View 返回的結(jié)果,推薦使用 Html.Partial。

打開(kāi) Index.cshtml,然后打開(kāi) Footer,放置如下代碼。

@{            MvcHtmlString result = Html.Partial ("Footer", Model.FooterData);    string finalResult = result.ToHtmlString().Replace("2015", "20000");            }@MvcHtmlString.Create(finalResult)

現(xiàn)在頁(yè)腳展示如下。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

為什么將 Partial View 放置在 Shared 文件夾下?

因?yàn)?Partial View 意味著可以重復(fù)利用的資源,因此放置它們的地點(diǎn)是 Shared 文件夾下。

我們不能將 Partial View 放置到一個(gè)特殊的控制器文件夾內(nèi)嗎?例如 Employee 或者 Authentication?

我們可以這樣做,但是在這種場(chǎng)景下,它將不會(huì)適用于指定控制器。

例如:當(dāng)我們將 Partial View 放置到 Employee 文件夾下,它將不會(huì)適用于 AuthenticationController 或者適用于 AuthenticationController 相關(guān)的視圖。

為什么 Partial View 的定義包含「邏輯」詞匯?

在定義中,我們已經(jīng)知道 Partial View 是一個(gè)可重用的視圖,但是它不能通過(guò)自己執(zhí)行。它需要放置到其它視圖中,然后作為這些視圖的一部分來(lái)展示。

我們所說(shuō)的 Partial View 可重用是事實(shí),但是我們提到的執(zhí)行在邏輯上是事實(shí)。技術(shù)上而言,這不是一個(gè)正確的解釋。我們可以創(chuàng)建一個(gè)行為方法,來(lái)返回如下的視圖結(jié)果。

public ActionResult MyFooter(){    FooterViewModel FooterData = new FooterViewModel();    FooterData.CompanyName = "StepByStepSchools";//Can be set to dynamic value    FooterData.Year = DateTime.Now.Year.ToString();    return View("Footer", FooterData);}

它將會(huì)展示如下的輸出。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

盡管在邏輯上沒(méi)有意義,但是技術(shù)上是可行的。Footer.cshtml 不會(huì)包含正確的結(jié)構(gòu)性 HTML。它意味著作為視圖的一部分來(lái)展示。因?yàn)槲覀冋f(shuō)「邏輯上是沒(méi)有意義的」。

為什么要?jiǎng)?chuàng)建 Partial View,而不是直接在視圖底部添加內(nèi)容?

這樣做有兩個(gè)優(yōu)勢(shì)。

  1. 可重用性。我們可以將一個(gè) Partial View 運(yùn)用到多個(gè)視圖中去。

  2. 代碼保留。將其放置為一個(gè)分割的文件,使其管理和操縱都非常方便。

為什么在 Partial View 中沒(méi)有創(chuàng)建 Header?

作為最佳實(shí)踐,我們需要為 Partial View 創(chuàng)建 Header,但是為了保持最初實(shí)驗(yàn)簡(jiǎn)單化,我們并沒(méi)有這樣做。

2. Lab 23 — 實(shí)現(xiàn)基于角色的安全性

在本次實(shí)驗(yàn)中,我們將會(huì)實(shí)現(xiàn) Admin 和 Non-Admin 兩種登錄功能。

需求是很簡(jiǎn)單的。即「Non-Admin 用戶不能創(chuàng)建 Employees」。

通過(guò)這個(gè)實(shí)驗(yàn),我們將會(huì)理解 MVC 中的兩個(gè)主題。

現(xiàn)在我們開(kāi)始進(jìn)行實(shí)驗(yàn)。為了簡(jiǎn)單化,我們將實(shí)驗(yàn)分為兩部分。

Part 1 — Non-Admin 用戶登錄,隱藏 AddNew 鏈接

第一步:創(chuàng)建標(biāo)識(shí) UserStatus 的枚舉

右擊 Models 文件夾,選擇「Add New Item」。

在對(duì)話框中選擇「Code File」選項(xiàng)。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

在名稱欄中輸入「UserStatus」,然后點(diǎn)擊添加。「Code File」的選項(xiàng)將會(huì)創(chuàng)建一個(gè)空白的「.cs」文件。

創(chuàng)建一個(gè)枚舉,命名為 UserStatus,代碼如下。

namespace WebApplication1.Models{    public enum UserStatus    {        AuthenticatedAdmin,        AuthentucatedUser,        NonAuthenticatedUser    }}

第二步:更改業(yè)務(wù)層功能

刪除 IsValidUser 功能,然后創(chuàng)建一個(gè)新的功能,命名為 GetUserValidity。

public UserStatus GetUserValidity(UserDetails u){    if (u.UserName == "Admin" && u.Password == "Admin")    {        return UserStatus.AuthenticatedAdmin;    }    else if (u.UserName == "Sukesh" && u.Password == "Sukesh")    {        return UserStatus.AuthentucatedUser;    }    else    {        return UserStatus.NonAuthenticatedUser;    }}

第三步:更改 DoLogin 行為方法

打開(kāi) AuthenticationController,然后更改 DoLogin 行為方法如下。

[HttpPost]public ActionResult DoLogin(UserDetails u){    if (ModelState.IsValid)    {        EmployeeBusinessLayer bal = new EmployeeBusinessLayer();        //New Code Start        UserStatus status = bal.GetUserValidity(u);        bool IsAdmin = false;        if (status==UserStatus.AuthenticatedAdmin)        {            IsAdmin = true;        }        else if (status == UserStatus.AuthentucatedUser)        {            IsAdmin = false;        }        else        {            ModelState.AddModelError("CredentialError", "Invalid Username or Password");            return View("Login");        }        FormsAuthentication.SetAuthCookie(u.UserName, false);        Session["IsAdmin"] = IsAdmin;        return RedirectToAction("Index", "Employee");        //New Code End    }    else    {        return View("Login");    }}

正如你所看見(jiàn)的,我們運(yùn)用 Session 變量來(lái)識(shí)別用戶是 Admin 用戶還是 non-Admin 用戶。

不知道什么是 Session?

Session 是 ASP.NET 的一個(gè)功能,在 ASP.NET MVC 中被重用。

我們運(yùn)用 Session 變量來(lái)承載用戶相關(guān)的數(shù)據(jù)。Session 的生命周期取決于用戶的生命周期。它將一直可用直到當(dāng)前的 Session 結(jié)束。

第四步:刪除已經(jīng)存在的 AddNew 鏈接

在「~/Views/Employee」文件夾下打開(kāi) Index.cshtml 視圖,然后完全刪除「Add New」超鏈接。

  1. Add New

第五步:創(chuàng)建 Partial View

右擊「~/Views/Employee」文件夾,然后選擇 Add -> View。設(shè)置視圖的名稱為「AddNewLink」,然后確保選擇「Create as a partial view」復(fù)選框。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

第六步:在 Partial View 中放置內(nèi)容

在剛創(chuàng)建的 Partial View 中放置如下內(nèi)容。

Add New

第七步:創(chuàng)建行為方法

打開(kāi) EmployeeController 然后創(chuàng)建一個(gè)新的行為方法,命名為「GetAddNewLink」。

public ActionResult GetAddNewLink(){    if (Convert.ToBoolean(Session["IsAdmin"]))    {        return Partial View("AddNewLink");    }    else    {        return new EmptyResult();    }}

第八步:展示 AddNew 鏈接

打開(kāi) Index.html,然后放置如下代碼。

Logout
@{  Html.RenderAction("GetAddNewLink");}

Html.RenderAction 執(zhí)行行為方法,然后向響應(yīng)流中直接寫(xiě)入結(jié)果。

第九步:執(zhí)行并測(cè)試

按下 F5,然后執(zhí)行應(yīng)用。

  • Test 1

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

  • Test 2

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

Part 2 — 直接的 URL 安全性

按照上述的邏輯,一件事是可以確保的。即現(xiàn)在 non-Admin 用戶不能通過(guò)超鏈接導(dǎo)航到 AddNew 行為。

這樣就夠了嗎?

答案是否定的,這還不夠。如果一個(gè) non-Admin 用戶直接通過(guò) URL 試圖導(dǎo)航到 AddNew 行為會(huì)發(fā)生什么呢。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

正如你在上述例子中所看見(jiàn)的,一個(gè) non-Admin 用戶依然可以訪問(wèn) AddNew 行為。

為 了解決這個(gè)問(wèn)題,我們需要運(yùn)用 MVC 中的 Action Filters。Action Filters 讓我們向行為方法中添加一些預(yù)處理和后處理的邏輯。在本實(shí)驗(yàn)中,我們將著重于 Action Filters 的預(yù)處理功能,在后面的實(shí)驗(yàn)中,我們?cè)僦赜诤筇幚砉δ堋?/p>

第一步:設(shè)置過(guò)濾器

在項(xiàng)目下創(chuàng)建一個(gè)新的文件夾,命名為 Filters,然后創(chuàng)建一個(gè)新的類(lèi),命名為 AdminFilter。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

第二步:創(chuàng)建過(guò)濾器

升級(jí)簡(jiǎn)單的 AdminFilter 類(lèi)到 ActionFilter,通過(guò)將其繼承 ActionFilterAttribute 類(lèi),代碼如下。

  1. publicclassAdminFilter:ActionFilterAttribute

  2. {

  3. }

注:為了運(yùn)用 ActionFilterAttribute,你需要在頂部引用 System.Web.Mvc。

第三步:增加安全認(rèn)證邏輯

在 ActionFilter 中重寫(xiě) OnActionExecuting 方法。

public override void OnActionExecuting(ActionExecutingContext filterContext){    if (!Convert.ToBoolean(filterContext.HttpContext.Session["IsAdmin"]))    {        filterContext.Result = new ContentResult()        {            Content="Unauthorized to access specified resource."        };    }}

第四步:附加過(guò)濾器

向 AddNew 和 SaveEmployee 行為方法添加過(guò)濾器。

[AdminFilter]public ActionResult AddNew(){    return View("CreateEmployee",new Employee());}......[AdminFilter]public ActionResult SaveEmployee(Employee e, string BtnSubmit){    switch (BtnSubmit)    {        case "Save Employee":            if (ModelState.IsValid)            {                EmployeeBusinessLayer empBal = new EmployeeBusinessLayer();........

第五步:執(zhí)行和測(cè)試

按下 F5,然后執(zhí)行應(yīng)用。運(yùn)用 non-Admin 身份登錄,然后試圖通過(guò) AddNew 行為的 URL 導(dǎo)航到 AddNew 行為方法。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

正如你所看見(jiàn)的,現(xiàn)在你的行為方法處于完全安全狀態(tài)。

Lab 23 的 Q&A

我們可以通過(guò)地址欄直接觸發(fā) GetAddNewLink 嗎?

答案是肯定的,我們已經(jīng)在「Talk on Lab 22」部分討論了這個(gè)行為。

直接停止執(zhí)行 GetAddNewLink 有可能嗎?

可以直接在 GetAddNewLink 中添加 ChildActionOnly 屬性。

[ChildActionOnly]public ActionResult GetAddNewLink(){    if (Convert.ToBoolean(Session["IsAdmin"])){

Html.Action 是用來(lái)做什么的?

就類(lèi)似于 Html.RenderAction,Html.Action 將會(huì)執(zhí)行行為方法用于呈現(xiàn)視圖的結(jié)果。下面是語(yǔ)法。

@Html.Action("GetAddNewLink");

可以看出,語(yǔ)法相對(duì)來(lái)說(shuō)簡(jiǎn)單多了。

兩者的區(qū)別是什么?

Html.RenderAction 將會(huì)把行為方法的執(zhí)行結(jié)果直接寫(xiě)入 HTTP 響應(yīng)流,而 Html.Action 將會(huì)返回 MvcHtmlString 結(jié)果。

哪個(gè)更推崇?是 Html.RenderAction 還是 Html.Action?

更推崇 Html.RenderAction,因?yàn)樗臁?/p>

什么時(shí)候用 Html.Action 更好?

當(dāng)我們想在呈現(xiàn)之前改變行為方法執(zhí)行的結(jié)果時(shí),用 Html.Action 更好。

什么是 ActionFilter?

就類(lèi)似于 AuthenticationFilter,ActionFilter 是 ASP.NET MVC 的一種過(guò)濾器類(lèi)型。它允許我們向行為方法添加預(yù)處理和后處理邏輯。

3. Lab 24 — 任務(wù)實(shí)驗(yàn) — 處理 CSRF ***

從視圖的安全性方面出發(fā),我們還需要在項(xiàng)目中處理 CSRF ***。這里我將不再做過(guò)多指導(dǎo),你需要自己手動(dòng)完成。

我建議你閱讀下述文章,然后實(shí)現(xiàn)方法。

如何在 MVC 中防止 CSRF ***

4. Lab 25 — 實(shí)現(xiàn)項(xiàng)目的一致性外觀

在 ASP.NET 領(lǐng)域中,一致性的布局意味著母版頁(yè)(MasterPage)。

但 ASP.NET MVC 是區(qū)別于此的。在 Razor 中,母版頁(yè)被稱為布局頁(yè)(Layout Pages)。

在正式開(kāi)始試驗(yàn)之前,我們先來(lái)討論一下在母版頁(yè)中我們需要放置哪些元素。

1.帶有歡迎信息的 Header。
2.帶有頁(yè)腳數(shù)據(jù)的 Footer。

最大的問(wèn)題是什么?

頁(yè)腳和頁(yè)眉的數(shù)據(jù)作為 ViewModel 的一部分從控制器傳輸?shù)揭晥D中。

7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

現(xiàn)在最大的問(wèn)題便是,當(dāng)頁(yè)眉和頁(yè)腳移動(dòng)到布局頁(yè)后,數(shù)據(jù)如何從視圖傳輸?shù)讲季猪?yè)。

解決方案 — 繼承

在這里我們可以簡(jiǎn)單地遵循面向?qū)ο罄^承準(zhǔn)則。讓我們通過(guò)一個(gè)小實(shí)驗(yàn)來(lái)理解。

第一步:創(chuàng)建 ViewModel 的基類(lèi)

在 ViewModel 文件夾下創(chuàng)建一個(gè)新的 ViewModel 類(lèi),稱為 BaseViewModel 類(lèi)。

public class BaseViewModel{    public string UserName { get; set; }    public FooterViewModel FooterData { get; set; }//New Property}

正如你所看見(jiàn)的,BaseViewModel 封裝了 Layout 頁(yè)所需的所有元素。

第二步:準(zhǔn)備 EmployeeListViewModel

從 EmployeeListViewModel 類(lèi)中移除 UserName 和 FooterData 屬性,然后讓它繼承 BaseViewModel 類(lèi)。

public class EmployeeListViewModel:BaseViewModel{    public List Employees { get; set; }}

第三步:創(chuàng)建布局頁(yè)

右擊 Shared 文件夾,選擇 Add -> MVC 5 Layout Page。輸入名稱為 MyLayout,然后點(diǎn)擊確定。

它將會(huì)創(chuàng)建一個(gè)如下格式的代碼。

  1.    

  2.    @ViewBag.Title

  3.    

  4.        @RenderBody()

  5.    

  • 第四步:轉(zhuǎn)換布局頁(yè)為強(qiáng)類(lèi)型布局

    在布局頁(yè)的上方放置如下的簡(jiǎn)單聲明,使其變?yōu)閺?qiáng)類(lèi)型布局。

    @using WebApplication1.ViewModels@model BaseViewModel

    第五步:設(shè)計(jì)布局頁(yè)

    在布局頁(yè)添加頁(yè)眉,頁(yè)腳和內(nèi)容三部分。

            @RenderSection("TitleSection")    @RenderSection("HeaderSection",false)            Hello, @Model.UserName        Logout            
        @RenderSection("ContentBody")    
        @Html.Partial("Footer",Model.FooterData)

    正如你所看見(jiàn)的,我們已經(jīng)為布局頁(yè)創(chuàng)建了三塊。Title 部分,Header 部分和Content 部分。內(nèi)容頁(yè)面將會(huì)用到這三部分來(lái)定義合適的內(nèi)容。

    第六步:向 Index 視圖附上 Layout 頁(yè)面

    打開(kāi) Index.cshtml 頁(yè)面,在頂部會(huì)發(fā)現(xiàn)如下代碼。

    @{    Layout = null;}

    將這段代碼改為如下代碼。

    @{    Layout = "~/Views/Shared/MyLayout.cshtml";}

    第七步:設(shè)計(jì) Index 視圖

    1. 從 Index 視圖中移除 Headers 和 Footers。

    2. 復(fù)制 Body 標(biāo)簽中的剩余內(nèi)容,然后將它保存在別處。

    3. 復(fù)制 Title 標(biāo)簽里的內(nèi)容。

    4. 將視圖中的所有 HTML 內(nèi)容都移除。確保你只是移除了 HTML,@model 和布局聲明不需要被移除。

    5. 定義 Title 部分和 Content 部分,內(nèi)容是剛才所復(fù)制下的內(nèi)容。

    完整的視圖將會(huì)如下所示。

    1. @usingWebApplication1.ViewModels

    2. @modelEmployeeListViewModel

    3. @{

    4.    Layout="~/Views/Shared/MyLayout.cshtml";

    5. }

    6. @sectionTitleSection{

    7.    MyView

    8. }

    9. @sectionContentBody{      

    10.    

             

    11.        @{

    12.            Html.RenderAction("GetAddNewLink");

    13.        }

    14.        

    15.            

    16.                

    17.                

    18.            

    19.            @foreach(EmployeeViewModel iteminModel.Employees)

    20.            {

    21.                

    22.                    

    23.                    

    24.                

    25.            }

    26.        

    27. EmployeeNameSalary
      @item.EmployeeName@item.Salary

    28.    

    29. }

    正如你所看見(jiàn)的,視圖中所有的元素都定義在指定的位置上。

    第八步:執(zhí)行并測(cè)試

    按下 F5,然后執(zhí)行應(yīng)用。導(dǎo)航到 Index 行為上。

    7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

    第九步:在 CreateEmployee 視圖中附上 Layout 頁(yè)面

    打開(kāi) Index.cshtml 頁(yè)面,在頂部會(huì)發(fā)現(xiàn)如下代碼。

    @{    Layout = null;}

    將其改為如下代碼。

    @{    Layout = "~/Views/Shared/MyLayout.cshtml";}

    第十步:設(shè)計(jì) CreateEmployee 視圖

    像第七步的步驟一樣,定義 CreateEmployee 視圖的區(qū)域。這一次會(huì)增加一點(diǎn)。我們將會(huì)定義 Header 部分。

    完整的 HTML 代碼如下。

    1. @usingWebApplication1.Models

    2. @modelEmployee

    3. @{

    4.    Layout="~/Views/Shared/MyLayout.cshtml";

    5. }

    6. @sectionTitleSection{

    7.    CreateEmployee

    8. }

    9. @sectionHeaderSection{

    10. }

    11. @sectionContentBody{

    12.    

    13.        

    14.            

    15.            

    16.                

    17.                

    18.            

    19.            

    20.                

    21.            

    22.            

    23.                

    24.                

    25.            

    26.            

    27.                

    28.            

    29.            

    30.                

    31.                

    32.            

    33.            

    34.                

    35.            

    36.            

    37.                

    38.            

    39.            

    40.                    FirstName:

    41.                

    42.                    

    43.                

    44.                    @Html.ValidationMessage("FirstName")

    45.                

    46.                    LastName:

    47.                

    48.                    

    49.                

    50.                    @Html.ValidationMessage("LastName")

    51.                

    52.                    Salary:

    53.                

    54.                    

    55.                

    56.                    @Html.ValidationMessage("Salary")

    57.                

    58.                    

    59.                    

    60.                    

    61.                

    62.    

    63. }

    第十一步:執(zhí)行并測(cè)試

    按下 F5,然后執(zhí)行應(yīng)用。通過(guò)嘗試超鏈接來(lái)導(dǎo)航到 AddNew 行為上。

    7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

    Index 視圖是 EmployeeListViewModel 的強(qiáng)類(lèi)型視圖,EmployeeListViewModel 又是 BaseViewModel 的子類(lèi),所以 Index 視圖可以運(yùn)轉(zhuǎn)。但是 CreateEmployee 視圖是 CreateEmployeeViewModel 的強(qiáng)類(lèi)型視圖,而 CreateEmployeeViewModel 不是 BaseViewModel 的子類(lèi),所以 CreateEmployee 出現(xiàn)了這樣的錯(cuò)誤。

    第十二步:準(zhǔn)備 CreateEmployeeViewModel

    讓 CreateEmployeeViewModel 繼承 BaseViewModel,代碼如下。

    public class CreateEmployeeViewModel:BaseViewModel{...

    第十三步:執(zhí)行并測(cè)試

    再一次測(cè)試。

    7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

    這次的錯(cuò)誤看起來(lái)與之前的不一樣。錯(cuò)誤真正的原因是,我們?cè)?AddNew 行為中沒(méi)有初始化 Header 和 Footer 的數(shù)據(jù)。

    第十四步:初始化 Header 和 Footer 數(shù)據(jù)

    將 AddNew 行為方法的代碼改為如下所示。

    public ActionResult AddNew(){    CreateEmployeeViewModel employeeListViewModel = new CreateEmployeeViewModel();    employeeListViewModel.FooterData = new FooterViewModel();    employeeListViewModel.FooterData.CompanyName = "StepByStepSchools";//Can be set to dynamic value    employeeListViewModel.FooterData.Year = DateTime.Now.Year.ToString();    employeeListViewModel.UserName = User.Identity.Name; //New Line    return View("CreateEmployee", employeeListViewModel);}

    第十五步:在 SaveEmployee 中初始化 Header 和 Footer 數(shù)據(jù)

    類(lèi)似于 SaveEmployee 行為方法一樣,我們更改其代碼如下。

    public ActionResult SaveEmployee(Employee e, string BtnSubmit){    switch (BtnSubmit)    {        case "Save Employee":            if (ModelState.IsValid)            {                ...            }            else            {                CreateEmployeeViewModel vm = new CreateEmployeeViewModel();                ...                vm.FooterData = new FooterViewModel();                vm.FooterData.CompanyName = "StepByStepSchools";//Can be set to dynamic value                vm.FooterData.Year = DateTime.Now.Year.ToString();                vm.UserName = User.Identity.Name; //New Line                return View("CreateEmployee", vm); // Day 4 Change - Passing e here            }        case "Cancel":            return RedirectToAction("Index");    }    return new EmptyResult();}

    第十六步:執(zhí)行并測(cè)試

    按下 F5,然后執(zhí)行應(yīng)用。

    7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

    Lab 25 的 Q&A

    RenderBody 是用于做什么的?

    當(dāng)我們第一次創(chuàng)建 Layout 頁(yè)面時(shí),我們有一個(gè) Razor 聲明如下。

    @Html.RenderBody()

    現(xiàn)在讓我們來(lái)理解下它是做什么的。在內(nèi)容頁(yè)面上,我們正常地定義區(qū)域,這些區(qū)域在布局頁(yè)聲明。

    但是奇怪的是,Razor 允許我們?cè)趨^(qū)域外定義一些內(nèi)容。在內(nèi)容頁(yè)面上,所有非區(qū)域內(nèi)的內(nèi)容將會(huì)被 RenderBody 函數(shù)呈現(xiàn)。

    下圖將會(huì)更好地進(jìn)行解釋。

    7 天玩轉(zhuǎn) ASP.NET MVC — 第 5 天

    我們有嵌套的布局嗎?

    答案是肯定的。我們能創(chuàng)建一個(gè)嵌套了其它布局頁(yè)的布局頁(yè)。語(yǔ)法是一樣的。

    在每一個(gè)視圖中都指定布局頁(yè)是必須的嗎?

    你能夠在 Views 文件夾下發(fā)現(xiàn)一個(gè)特殊的布局頁(yè),稱為「__ ViewStart.cshtml」。在其內(nèi)部設(shè)定定義,將會(huì)應(yīng)用于所有視圖。

    例如,在「__ ViewStart.cshtml」中放置如下的代碼,將會(huì)使「_Layout.cshtml」適用于所有視圖的布局。

    @{    Layout = "~/Views/Shared/_Layout.cshtml";}

    在每一個(gè)行為方法中,是否都需要放置 Header 和 Footer 的數(shù)據(jù)代碼?

    答案是否定的。我們可以運(yùn)用 Action 過(guò)濾器來(lái)避免這種重復(fù)。我們將會(huì)在接下來(lái)的實(shí)驗(yàn)中實(shí)踐。

    在子視圖中定義所有區(qū)域是否是必須的?

    答案是肯定的。如果 Section 的聲明為必須的,那么默認(rèn)值是 True。

    @RenderSection("HeaderSection",false) // Not required@RenderSection("HeaderSection",true) // required@RenderSection("HeaderSection") // required

    5. Lab 26 — 運(yùn)用 Action 過(guò)濾器讓 Header 和 Footer 數(shù)據(jù)更高效

    在 Lab 23 中,我們已經(jīng)知道了 ActionFilter 的優(yōu)勢(shì),現(xiàn)在我們來(lái)看它的第二點(diǎn)優(yōu)勢(shì)。

    第一步:從行為方法中刪除冗余代碼

    從 Index,AddNew 和 SaveEmployee 方法中刪除 Header 和 Footer 數(shù)據(jù)的代碼。

    Header 代碼如下。

    bvm.UserName = HttpContext.Current.User.Identity.Name;

    Footer 代碼如下。

    bvm.FooterData = new FooterViewModel();bvm.FooterData.CompanyName = "StepByStepSchools";//Can be set to dynamic valuebvm.FooterData.Year = DateTime.Now.Year.ToString();

    第二步:創(chuàng)建 HeaderFooterFilter

    在 Filters 文件夾下創(chuàng)建一個(gè)類(lèi),命名為 HeaderFooterFilter,然后通過(guò)將它繼承 ActionFilterAttribute 類(lèi)來(lái)將其升級(jí) Action 過(guò)濾器。

    第三步:升級(jí) ViewModel

    在 HeaderFooterFilter 類(lèi)中重寫(xiě) OnActionExecuted。在這個(gè)方法中我們將會(huì)得到當(dāng)前的視圖模型,然后將其附上 Header 和 Footer 數(shù)據(jù)。

    public class HeaderFooterFilter : ActionFilterAttribute{    public override void OnActionExecuted(ActionExecutedContext filterContext)    {        ViewResult v = filterContext.Result as ViewResult;        if(v!=null) // v will null when v is not a ViewResult        {                BaseViewModel bvm = v.Model as BaseViewModel;                if(bvm!=null)//bvm will be null when we want a view without Header and footer                {                        bvm.UserName = HttpContext.Current.User.Identity.Name;                        bvm.FooterData = new FooterViewModel();                        bvm.FooterData.CompanyName = "StepByStepSchools";//Can be set to dynamic value                        bvm.FooterData.Year = DateTime.Now.Year.ToString();                    &            
                
                            
    本文標(biāo)題:7天玩轉(zhuǎn)ASP.NETMVC—第5天
    轉(zhuǎn)載源于:http://weahome.cn/article/jpiihe.html

    在線咨詢

    微信咨詢

    電話咨詢

    028-86922220(工作日)

    18980820575(7×24)

    提交需求

    返回頂部