1. 程式人生 > 實用技巧 >學習MVC專案在7天-第5天

學習MVC專案在7天-第5天

介紹 歡迎來到“7天學習MVC專案”系列的第5天。希望你們在第一天到第四天讀得愉快。前幾天必須在第5天之前完成。 完整的系列 第1天第2天第3天第4天第5天第6天7天獎金第1天獎金第2天 我們很高興地宣佈,這篇文章現在可以從www.amazon.com和www.flipkart.com獲得同樣的紙質書 議程 實驗室22 -在實驗室22實驗室23日新增頁尾談實現基於角色的安全第1部分第2部分討論在實驗室23日實驗室24 -分配實驗室處理CSRF攻擊實驗室25 -實現一致的外觀專案討論在實驗室25實驗室26日——頭和FooterData程式碼更高效過濾器的結論與行動 實驗室22 -新增頁尾 在這個實驗室中,我們將在我們的員工螢幕上新增頁尾。 本實驗室的主要目的是瞭解部分觀點。 什麼是“片面觀點”? 從邏輯上講,部分檢視是一個永遠不會直接顯示的可重用檢視。它將包含在其他檢視中,並顯示為該檢視的一部分。它類似於Asp中的使用者控制元件。Net web表單,但是沒有程式碼。 步驟1 -為部分檢視建立檢視模型 右鍵單擊ViewModel資料夾並建立一個名為FooterViewModel的類,如下所示。 隱藏,複製Code

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

步驟2 -建立部分檢視 右擊“~/Views/Shared”資料夾。,選擇Add>的在檢視。 將檢視名稱作為頁尾,勾選“建立為部分檢視”複選框,然後點選“新增”。 注意:我們在第一天已經討論了共享資料夾。共享資料夾包含的檢視不是特定於特定控制器的。共享資料夾中的檢視對所有控制器都可用。 步驟3 -在部分檢視中顯示資料 開啟的頁尾。cshtml,並在其中放入下面的HTML。 隱藏,複製Code@using WebApplication1.ViewModels @ model FooterViewModel div style="text-align:right;background-color: silver;color: darkcyan;border: 1px solid gray;margin-top:2px; @ model。公司名稱©@Model.Year & lt; / div> 步驟3 -在主檢視模型中包括頁尾資料 開啟EmployeeListViewModel類並新增一個新的屬性來儲存頁尾資料,如下所示。 隱藏,複製Codepublic類EmployeeListViewModel { 公共List< EmployeeViewModel>員工{得到;設定;} 獲取;設定;} 獲取;設定;} / /新屬性 } 在我們的例子中,頁尾(部分檢視)將顯示為索引檢視的一部分。 我們將從索引檢視向頁尾傳遞必要的資料。 索引檢視是EmployeeListViewModel型別的強型別檢視,因此頁尾檢視所需的所有資料都應該封裝在EmployeeListViewModel中。 步驟4 -設定頁尾資料 開啟EmployeeController並在索引操作方法中將值設定為FooterData屬性,如下所示。 隱藏,複製Code

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);
}

第五步-顯示頁尾 開放指數。cshtml並在表標記後顯示頁尾部分檢視,如下所示。 隱藏,複製程式碼& lt; / table> @ { 超文字標記語言RenderPartial方法(“頁尾”,Model.FooterData); } & lt; / div> & lt; / body> & lt; / html> 步驟6 -執行和測試 按F5。導航到索引檢視。(我相信,你現在知道該怎麼做了。) 在22實驗室演講 什麼Html。部分做了什麼? 就像Html。RenderPartial方法,Html。Partial將用於在檢視中顯示部分檢視。 這是它的語法 隱藏,複製Code

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

語法比以前的語法簡單得多。 兩者之間有什麼區別? 超文字標記語言RenderPartial將部分檢視的結果直接寫入HTTP響應流,而Html。Partial將返回結果為MvcHtmlString。 什麼是MvcHtmlString和為什麼Html。部分返回MvcHtmlString而不是字串? 首先讓我們瞭解什麼是MvcHtmlString? 根據MSDN“MvcHtmlString表示一個html編碼的字串,不應該再次編碼”。 讓我們簡化這個定義。 請看下面的程式碼。 隱藏,複製Code

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

它將生成以下輸出 如您所見,razor按原樣顯示了整個內容。許多人可能會想到看到粗體字串,但Razor Html在顯示之前對內容進行編碼,這就是為什麼我們得到的是純內容而不是粗體字串。 當我們不希望razor進行編碼時,我們使用MvcHtmlString。MvcHtmlString是對razor的一個指示:“字串已經編碼了,不需要再編碼了”。 例如,請看下面的程式碼。 隱藏,複製Code

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

它將生成以下輸出 為什麼Html。部分返回MvcHtmlString而不是字串? 我們已經瞭解了一個事實:“razor總是會編碼字串,但它從不編碼MvcHtmlString”。如果部分檢視內容被認為是純字串,那麼它是沒有意義的。我們希望它被視為HTML內容,因此我們必須停止razor的編碼,因此部分方法被設計為返回MvcHtmlString。 是什麼推薦的Html。RenderPartial方法或Html.Partial嗎? 超文字標記語言建議使用渲染部分,因為它更快。 當Html。偏愛部分的? 當我們想要在顯示前改變部分檢視返回的結果時,建議這樣做。 開放指數。cshtml並開啟頁尾程式碼到下面的程式碼和測試。 隱藏,複製Code

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

現在頁尾看起來像下面。 為什麼將部分檢視放在共享資料夾中? 部分檢視意味著可重用性,因此它們的最佳位置是共享資料夾。 我們不能把部分檢視放在一個特定的控制器資料夾中嗎,比如僱員或身份驗證? 我們可以這樣做,但在這種情況下,它不會只對特定的控制器可用。 例如:當我們在僱員資料夾中保留部分檢視時,它將不能用於AuthenticationController或與AuthenticationController相關的檢視。 為什麼部分檢視的定義包含“邏輯”這個詞? 在定義中我們已經說過,部分檢視是一個可重用的檢視,但它不會被自己執行。它必須放在其他檢視中,然後作為檢視的一部分顯示。 我們所說的可重用性是完全正確的,但我們所說的執行只是在邏輯上正確的。從技術上講,這不是一個正確的說法。我們可以建立一個action方法,它將返回一個ViewResult,如下所示。 隱藏,複製Code

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);
}

它將顯示如下輸出 雖然邏輯上說不通,但技術上是可能的。頁尾。cshtml不包含適當結構的HTML。它意味著被顯示為其他檢視的一部分。因此我說,“從邏輯上講,這沒有道理”。 為什麼建立部分檢視而不是直接在檢視中放置頁尾內容? 兩個優點 可重用性——我們可以在其他檢視中重用相同的部分檢視。程式碼維護——將其放在單獨的檔案中,便於管理和操作。 為什麼頭不是作為部分檢視建立的? 作為一個最佳實踐,我們必須為頭部建立部分檢視,但為了使最初的實驗室更簡單,我們將其保持內聯。 實驗室23 -實現基於角色的安全性 在這個實驗中,我們將實現管理員和非管理員登入特性。 需求非常簡單。 “非管理員使用者不能建立新員工”。 通過這個實驗,我們將瞭解MVC中的另外兩個主題。 會話操作過濾器 讓我們從我們的實驗室開始 為了簡單起見,讓我們把它分成兩部分。 第1部分-隱藏AddNew連結從非管理員使用者 步驟1 -建立列舉來標識使用者狀態 右鍵點選模型資料夾,選擇“新增新專案”。 從對話方塊中選擇“程式碼檔案”選項。 把名字設為“UserStatus”,然後點選新增。 “程式碼檔案”選項將建立一個空白“。cs”檔案。 在其中建立一個名為UserStatus的列舉,如下所示。 隱藏,複製Codenamespace WebApplication1.Models { 公共enum UserStatus { AuthenticatedAdmin, AuthentucatedUser, NonAuthenticatedUser } } 步驟2 -更改業務層功能 刪除IsValidUser函式並建立一個名為GetUserValidity的新函式,如下所示。 隱藏,複製Codepublic UserStatus GetUserValidity(UserDetails u) { 如果(u。使用者名稱==“Admin”&u。密碼= =“Admin”) { 返回UserStatus.AuthenticatedAdmin; } else if (u。使用者名稱==“Sukesh”&u。密碼= =“Sukesh”) { 返回UserStatus.AuthentucatedUser; } 其他的 { 返回UserStatus.NonAuthenticatedUser; } } 步驟3 -改變行動方法 開啟AuthenticationController並更改DoLogin操作方法,如下所示。 隱藏,收縮,複製程式碼(HttpPost) 公眾行動結果DoLogin(使用者詳情u) { 如果(ModelState.IsValid) { bal = new EmployeeBusinessLayer(); / /新程式碼開始 UserStatus status = bal.GetUserValidity(u); bool IsAdmin = false; 如果狀態= = UserStatus.AuthenticatedAdmin) { IsAdmin = true; } else if (status == UserStatus.AuthentucatedUser) { IsAdmin = false; } 其他的 { 模型狀態。AddModelError(“CredentialError”,“無效的使用者名稱或密碼”); 返回檢視(“登入”); } FormsAuthentication.SetAuthCookie (u。使用者名稱錯誤); 會話(“IsAdmin”)= IsAdmin; 返回RedirectToAction(“指數”,“員工”); / /新程式碼 } 其他的 { 返回檢視(“登入”); } } 如您所見,我們使用session變數來標識使用者是admin使用者還是非admin使用者。 不知道會議? 會話是Asp的特性。在asp.net中重用。淨MVC。 我們使用會話變數來儲存使用者相關的資料。會話變數的生命週期就是使用者的生命週期。它將一直可用到當前會議結束。 步驟4 -刪除現有的AddNew連結 開放指數。cshtml檢視從“~/Views/Employee”資料夾和刪除“新增新”超連結完全。 隱藏,警察y Code< !——從索引中刪除以下行。cshtml——比; & lt; a href = " /員工/ AddNew”在新增New< / a> 步驟5 -克里特島部分檢視 右擊“~/Views/Employee”資料夾,選擇Add>>View。將檢視名稱設定為“AddNewLink”,並確保選中“建立部分檢視”複選框。 步驟6 -將內容放在部分檢視中 只需在新建立的部分檢視中放入以下內容。 隱藏,複製Code

<ahref="/Employee/AddNew">Add New</a>

步驟7 -建立行動方法 開啟EmployeeController並建立一個名為“GetAddNewLink”的新操作方法,如下所示。 隱藏,複製Codepublic ActionResult GetAddNewLink() { 如果(Convert.ToBoolean(會話(“IsAdmin”))) { 返回區域性檢視(“AddNewLink”); } 其他的 { 返回新EmptyResult (); } } 步驟8 -顯示新增新連結 開啟Index.html並簡單地將以下程式碼放入其中。 隱藏,複製Code

<ahref="/Authentication/Logout">Logout</a>
</div>
<hr/>
@{
 Html.RenderAction("GetAddNewLink");
}
<div>
<tableborder="1">
<tr>

超文字標記語言RenderAction執行動作方法並直接將結果寫入響應流。 步驟9 -執行和測試 按F5並執行應用程式。 測試1 測試2 第2部分-直接URL安全 有了以上的邏輯,有一件事是可以保證的。現在,非管理員使用者將不能通過超連結導航到AddNew action。 是足夠的嗎? 不,這還不夠。如果一個非管理員使用者直接嘗試通過URL導航到AddNew操作。 正如您在上面的示例中看到的,非管理員使用者能夠訪問AddNew操作。 為了解決這個問題,我們將使用MVC ActionFilters。動作過濾器讓我們向動作方法中新增一些預處理和後處理邏輯。在這個實驗室裡,我們會研究ActionFilters的預處理支援,在接下來的實驗室裡,我們也會研究後處理功能。 步驟1 -設定過濾器。 在專案中建立一個名為Filters的新資料夾,並建立一個名為AdminFilter的新類。 步驟2 -建立過濾器 通過從ActionFilterAttribute類繼承簡單的AdminFilter類,將其升級為ActionFilter,如下所示。 隱藏,複製Codepublic類AdminFilter:ActionFilterAttribute { } 注意:要使用ActionFilterAttribute,你必須使用System.Web。Mvc在頂部。 步驟3 -新增安全驗證邏輯 在ActionFilter中覆蓋onactionexecution如下。 隱藏,複製程式碼公共覆蓋void onactionexecute (ActionExecutingContext filterContext) { 如果(! Convert.ToBoolean (filterContext.HttpContext.Session [" IsAdmin "])) { filterContext。Result = new ContentResult() { Content="未授權訪問指定資源。" }; } } 步驟4 -安裝過濾器 將篩選器同時附加到AddNew和SaveEmployee操作方法,如下所示。 隱藏,複製程式碼(AdminFilter) 公共ActionResult AddNew () { ,,返回檢視(“CreateEmployee”,新員工()); } … … (AdminFilter) SaveEmployee(僱員e,字串BtnSubmit) { ,,開關(BtnSubmit) ,,{ ,,,,例“拯救員工”: ,,,,,,如果(ModelState.IsValid) ,,,,,,{ ,,,,,,,,EmployeeBusinessLayer empBal = new EmployeeBusinessLayer(); … … 步驟5 -執行和測試 按F5並執行應用程式。使用非管理憑證登入,並嘗試通過放置AddNew動作的URL導航到AddNew動作方法。 如您所見,現在您的操作方法是完全安全的。 注意:無論我們在這個實驗室中使用什麼策略和邏輯來實現基於角色的安全性,都可能不是最好的解決方案。您可能有更好的邏輯來實現這種行為。這只是實現目標的方法之一。 在23實驗室演講 我們可以通過瀏覽器位址列直接呼叫GetAddNewLink嗎? 是的,我們已經在“22號實驗室談話”部分討論過這種行為。 有沒有可能停止直接執行GetAddNewLink? 用ChildActionOnly屬性修飾GetAddNewLink。 隱藏,複製程式碼(ChildActionOnly) 公共ActionResult GetAddNewLink () { ,,如果(Convert.ToBoolean(會話(“IsAdmin”))) ,,{ 什麼Html。行動呢? 就像Html。RenderAction, Html。Action將執行Action方法並在檢視中顯示結果。 這是它的語法 隱藏,複製[email protected](“GetAddNewLink”); 語法比以前的語法簡單得多。 兩者之間有什麼區別? 超文字標記語言RenderAction將把動作方法執行的結果直接寫入HTTP響應流,而不是Html。操作將以MvcHtmlString的形式返回結果。 什麼是推薦的Html。RenderAction還是Html.Action ? 超文字標記語言建議使用RenderAction,因為它更快。 當Html。行動將是首選? 當我們想在顯示之前改變動作方法執行所返回的結果時,建議使用此方法。 ActionFilter是什麼? 就像AuthorizationFilter, ActionFilter是Asp中的一種過濾器。淨MVC。它允許我們新增預處理和後處理邏輯to動作方法執行。 注意:在每次實驗之後,我們都在盡我們最大的努力來涵蓋開發人員可能遇到的每一個問題。如果您認為還需要新增更多問題,請將您的問題傳送到[email protected] 實驗室24 -任務實驗室-處理CSRF攻擊 從安全的角度來看,我們還必須處理CSRF對專案的攻擊。這個我將留給你們。 我建議您閱讀本文並實現SaveEmployee操作方法。 http://www.codeproject.com/Articles/994759/What-is-CSRF-attack-and-how-can-we-prevent-the-sam 實驗25 -在整個專案中實現一致的外觀 在ASP。NET世界一致的佈局意味著母版。 ASP。NET MVC和它沒有什麼不同。在Razor中,母版頁稱為佈局頁。 在我們開始我們的實驗室之前,首先讓我們討論一下在佈局頁面中需要放置的所有東西 頁首與歡迎訊息頁尾與頁尾資料 最大的問題? 頁尾和頁首的資料作為ViewModel的一部分從控制器傳遞給檢視。 現在最大的問題是,在頁首和頁尾被移動到佈局頁面後,資料將如何從檢視傳遞到佈局頁面。 解決方案——繼承 在這裡,我們可以簡單地遵循面向物件繼承原則。讓我們用實驗室來理解它。 步驟1 -建立基類ViewModel 在ViewModel資料夾中建立一個名為BaseViewModel類的新檢視模型,如下所示。 隱藏,複製Codepublic類BaseViewModel { ,,獲取;設定;} ,,獲取;設定;} / /新屬性 }, 正如你所看到的,BaseViewModel封裝了佈局頁面所需的一切 步驟2 -準備EmployeeListViewModel 從EmployeeListViewModel類中刪除使用者名稱和FooterData屬性,並從BaseViewModel繼承它。 隱藏,複製Codepublic類EmployeeListViewModel:BaseViewModel { 公共List< EmployeeViewModel>員工{得到;設定;} } 步驟3 -建立佈局頁面 右擊共享資料夾。選擇MVC 5佈局頁面。將名稱設定為MyLayout並單擊ok。 它將建立一個如下所示的結構。 隱藏,Code<影印件;!DOCTYPE html> & lt; html> & lt; head> meta name="viewport" content="width=device-width" /> & lt; title> @ViewBag.Title< / title> & lt; / head> & lt; body> & lt; div> @RenderBody () & lt; / div> & lt; / body> & lt; / html> 步驟4 -將佈局轉換為強型別佈局 只需將以下語句放在佈局頁面的頂部,並使其成為強型別佈局。 隱藏,複製Code@using WebApplication1.ViewModels @ model BaseViewModel 步驟5 -設計佈局頁面 在佈局頁面新增頁首,頁尾和三個部分的內容如下。 隱藏,複製Code< html> & lt; head> ,,meta name="viewport" content="width=device-width" /> ,,& lt; title> @RenderSection(“TitleSection”)& lt; / title> ,,@RenderSection(“HeaderSection”,假) & lt; / head> & lt; body> ,,& lt; div風格= " text-align:對"比; ,,,,你好,@Model.UserName ,,,,& lt; a href = " /認證/登出”祝辭Logout< / a> ,,& lt; / div> ,,& lt;人力資源/比; ,,& lt; div> ,,@RenderSection(“ContentBody”) ,,& lt; / div> ,,@Html.Partial(“頁尾”,Model.FooterData) & lt; / body> & lt; / html> 如您所見,我們在佈局頁面中建立了三個部分。標題部分,標題部分和內容體。內容頁將使用這些部分來定義適當的內容。 注意:在定義HeaderSection時,傳遞第二個引數。這個引數決定它是可選的部分還是必須的部分。False表示它是可選的部分。 步驟6 -附加布局頁到索引檢視 開放指數。cshtml,在頂部您將發現以下程式碼。 隱藏,複製Code@ { ,,佈局=零; } 將其更改為以下程式碼。 隱藏,複製Code@ { ,,佈局= " ~ /檢視/共享/ MyLayout.cshtml”; } 步驟7 -設計索引檢視 從索引檢視中取出頁首和頁尾。複製正文標籤中的剩餘內容並將其儲存在某個地方。從檢視中刪除所有的HTML內容。確保你只是刪除了HTML, @model和佈局語句不應該被觸動。使用之前複製的內容定義標題和Contentbody。 完整的檢視如下所示。 隱藏,收縮,複製Code@using WebApplication1.ViewModels @ model EmployeeListViewModel @ { 佈局= " ~ /檢視/共享/ MyLayout.cshtml”; } @section TitleSection { MyView } @section ContentBody { & lt; div> @ { Html.RenderAction(“GetAddNewLink”); } & lt;表邊界=“1”在 & lt; tr> & lt; th>員工Name< / th> & lt; th>薩拉ry< / th> & lt; / tr> @foreach (employee . employees中的EmployeeViewModel項) { & lt; tr> & lt; td> @item.EmployeeName< / td> & lt; td風格= " background: @item.SalaryColor "祝辭@item.Salary< / td> & lt; / tr> } & lt; / table> & lt; / div> } 如您所見,檢視中的所有內容都是在某個部分中定義的。 步驟8 -執行和測試 按F5並執行應用程式。導航到索引操作。 步驟9 -附加布局頁面到CreateEmployee檢視 開放指數。cshtml,在頂部您將發現以下程式碼。 隱藏,複製Code

@{
 Layout = null;
}

將其更改為以下程式碼。 隱藏,複製Code

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

步驟10 -設計CreateEmployee檢視 按照相同的步驟7在CreateEmployee檢視中定義節。這一次將增加一項功能。我們還將定義HeaderSection。 完整的HTML如下所示。 隱藏,收縮,複製Code

@using WebApplication1.Models
@model Employee
@{
    Layout = "~/Views/Shared/MyLayout.cshtml";
}

@section TitleSection{
    CreateEmployee
}

@section HeaderSection{
<scriptsrc="~/Scripts/Validations.js"></script>
<script>
    function ResetForm() {
        document.getElementById('TxtFName').value = "";
        document.getElementById('TxtLName').value = "";
        document.getElementById('TxtSalary').value = "";
    }
</script>
}
@section ContentBody{ 
    <div>
        <formaction="/Employee/SaveEmployee"method="post"id="EmployeeForm">
            <table>
            <tr>
                <td>
                    First Name:
                </td>
                <td>
                    <inputtype="text"id="TxtFName"name="FirstName"value="@Model.FirstName"/>
                </td>
            </tr>
            <tr>
                <tdcolspan="2"align="right">
                    @Html.ValidationMessage("FirstName")
                </td>
            </tr>
            <tr>
                <td>
                    Last Name:
                </td>
                <td>
                    <inputtype="text"id="TxtLName"name="LastName"value="@Model.LastName"/>
                </td>
            </tr>
            <tr>
                <tdcolspan="2"align="right">
                    @Html.ValidationMessage("LastName")
                </td>
            </tr>

            <tr>
                <td>
                    Salary:
                </td>
                <td>
                    <inputtype="text"id="TxtSalary"name="Salary"value="@Model.Salary"/>
                </td>
            </tr>
            <tr>
                <tdcolspan="2"align="right">
                    @Html.ValidationMessage("Salary")
                </td>
            </tr>

            <tr>
                <tdcolspan="2">

                    <inputtype="submit"name="BtnSubmit"value="Save Employee"onclick="return IsValid();"/>
                    <inputtype="submit"name="BtnSubmit"value="Cancel"/>
                    <inputtype="button"name="BtnReset"value="Reset"onclick="ResetForm();"/>
                </td>
            </tr>
            </table>
    </div>
}

步驟11 -執行和測試 按F5並執行應用程式,然後嘗試通過超連結導航到AddNew操作。 索引檢視是EmployeeListViewModel型別的強型別檢視它是BaseViewModel的子檢視這就是它能工作的原因CreateEmployee檢視是CreateEmployeeViewModel型別的強型別檢視,它不是BaseViewModel的子檢視,因此發生了這樣的錯誤。 步驟12 -準備CreateEmployeeViewModel 從BaseViewModel繼承CreateEmployeeViewModel,如下所示 隱藏,複製Code

public class CreateEmployeeViewModel:BaseViewModel
{
...

步驟13 -執行和測試 再做一次測試。 這個錯誤看起來和實際的J很不一樣 出現這種錯誤的真正原因是,我們沒有初始化AddNew動作中的Header和FooterData。 第14步-初始化頁首和頁尾資料 將AddNew操作方法程式碼更改為如下。 隱藏,複製Code

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);
}

步驟15 -初始化SaveEmployee中的頭和腳資料 在SaveEmployee操作方法中執行相同的操作。 隱藏,複製Code

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();
}

步驟16 -執行和測試 按F5並執行應用程式。 在25實驗室演講 RenderBody做什麼? 當我們第一次建立佈局頁面時,它有一個razor stamen,如下所示。 隱藏,複製Code

@Html.RenderBody()

我們來看看它是做什麼的? 在內容頁面中,我們通常定義在佈局頁面中宣告的部分。 但奇怪的是,Razor也允許我們定義section之外的一些內容。 內容頁面中的所有非節內容將由RenderBody函式呈現 下面的圖片解釋得更好。 。 我們可以有巢狀佈局嗎? 是的,我們可以。我們可以建立一個佈局頁面,它將使用一些其他的佈局頁面。語法是相同的。 是否需要在每個檢視中指定佈局頁面? 您將發現一個特殊的檢視,稱為摔打檢視。檢視資料夾中的cshtml。在此定義的設定將應用於所有檢視。 示例——簡單地將以下程式碼放入剩餘的viewstart中。cshtml,它將設定佈局頁為所有其他檢視。 隱藏,複製Code

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

是否需要在每個動作方法中放入Header和FooterData程式碼? 不,不是必須的。我們可以通過動作過濾器來消除這種重複。這將是我們的下一個實驗室。 在子檢視中定義所有的section是必須的嗎? 如果節宣告為必修節,則為。預設值為true。 隱藏,複製Code

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

實驗室26 -使頁首和頁尾資料程式碼更有效的行動過濾器 在23號實驗室裡,我們已經看到了ActionFilter的一個優點,現在是時候做第二個了。 步驟1 -從動作方法中刪除冗餘程式碼 從Index、AddNew和SaveEmployee方法(在Employee控制器中)中刪除Header和FooterData程式碼。 作為引用,標題程式碼如下所示 隱藏,複製Code

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

頁尾程式碼看起來像這樣 隱藏,複製Code

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

步驟2 -建立HeaderFooterFilter 在Filters資料夾中建立一個名為HeaderFooterFilter的新類,並通過從ActionFilterAttribute類繼承將其升級為Action filter 步驟2 -升級檢視模型 在HeaderFooterFilter類中重寫onactionexecution。在此方法中,獲取當前檢視模型並附加頁首和頁尾資料。 隱藏,複製Code

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();      
        }
    }
  }
}

onactionexecution將用於向動作方法執行新增後期處理邏輯。 步驟4 -安裝過濾器 將HeaderFooterFilter附加到Index、AddNew和SaveEmployee操作方法。 隱藏,複製Code

[HeaderFooterFilter]
public ActionResult Index()
{
  EmployeeListViewModel employeeListViewModel = new EmployeeListViewModel();
...
}
...
[AdminFilter]
[HeaderFooterFilter]
public ActionResult AddNew()
{
  CreateEmployeeViewModel employeeListViewModel = new CreateEmployeeViewModel();
  //employeeListViewModel.FooterData = new FooterViewModel();
  //employeeListViewModel.FooterData.CompanyName = "StepByStepSchools";
...
}
...
[AdminFilter]
[HeaderFooterFilter]
public ActionResult SaveEmployee(Employee e, string BtnSubmit)
{
  switch (BtnSubmit)
  {
    ...

步驟5 -執行和測試 按F5並執行應用程式。 結論 現在我們完成了第5天。第六天將是最艱難和最有趣的一天。請繼續關注我 你的評論,郵件總是激勵我們做更多。把你的想法和評論寫在下面,或者傳送郵件到[email protected] 在Facebook, LinkedIn或twitter上聯絡我們,以保持最新的版本。 如需在孟買進行線下技術培訓,請訪問StepByStepSchools.Net 對於線上培訓訪問Compile.com或www.Sukesh-Marla.com 如果你想開始與MVC 5開始與下面的視訊學習MVC 5在2天。 本文轉載於:http://www.diyabc.com/frontweb/news1729.html