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

學習MVC專案在7天-獎金的第二天

介紹 本文是“7天學習MVC專案”系列的延續。正如我所承諾的,這裡是本系列的第二篇獎勵日文章。這是本系列的最後一篇文章。我相信你喜歡整個系列。謝謝大家的支援,祝大家好運。 今天我們將討論一些關於Asp的話題。Net MVC,我們還沒有涉及到的專案。 理解Asp中的TempData。Net MVC TempData是什麼?當TempData值被刪除?如果沒有讀取TempData值會發生什麼?保持和偷看方法 避免Asp中的CSRF攻擊。Net mvc mvc繫結和縮小 理解繫結理解縮小在Asp中實現繫結和縮小。Net MVC 建立客戶助手類MVC單元測試從MVC 5結論開始 完整的系列 第1天第2天第3天第4天第5天第6天7天獎金第1天獎金第2天 我們很高興地宣佈,這篇文章現在可以從www.amazon.com和www.flipkart.com獲得同樣的紙質書 理解Asp中的TempData。Net MVC 對於這個主題,我們不會做任何演示。TempData在不同的情況下表現不同。將所有場景合併到一個專案中是不可能的。這就是為什麼我們將嘗試一步一步地涵蓋和理解所有場景的原因。 TempData是什麼? TempData是一個生命週期較短的會話。就像session一樣,它也是用於儲存使用者特定值的鍵值對。會話和TempData的區別在於,TempData讓我們只在單個請求週期內維護資料。 要正確理解TempData,您必須正確理解“單個請求”的含義 使用者通過瀏覽器的位址列發出請求,該請求由一個動作方法處理。我們稱它為Request 1。現在,除非終端使用者獲得最終響應,否則它將被呼叫為request 1。一旦終端使用者得到響應,請求就結束了。現在通過點選一個超連結,按鈕或再次在瀏覽器位址列的幫助下,終端使用者可以提出一個新的請求。 檢視下面的影象來理解“單個請求週期”和TempData 程式碼示例: 隱藏,複製Code

public ActionResult M1()
{
    TempData["a"] = "Value";
    string s = TempData["a"].ToString();  // TempData will be available
    return RedirectToAction("M2");
}

public ActionResult M2()
{
    string s = TempData["a"].ToString(); //TempData will be available
    return RedirectToAction ("M3");
} 
public
ActionResult M3() { string s = TempData["a"].ToString();// TempData will be available return view ("Some View"); // TempData will be available inside view alsoJ }

不管它是檢視還是動作方法。除非請求完成,否則TempData中的值將可用。 當TempData值被刪除? 在請求結束時,自動刪除TempData中的值,並標記為刪除。當我們讀取值時,它將被標記為刪除。 示例1 隱藏,複製Code

public ActionResult M1()
{
    TempData["a"] = "Value";
    return view("MyView"); 
}
...
...
...
View Code
...
...
@{
    string s = TempData["a"].ToString(); // TempData is marked for deletion
}

示例2 隱藏,複製Code

public ActionResult M1()
{
    TempData["a"] = "Value";
    string s = TempData["a"].ToString(); // TempData is marked for deletion
    return view("MyView");  // MyView can access TempData because it will be deleted at the end of the request
}

注意:在上面的兩個示例中,一旦讀取值,就會標記為刪除值。現在,對於下一個請求,這個值將不可用,因為在當前請求的末尾,當前TempData將被刪除。 如果沒有讀取TempData值會發生什麼? 根據我們的最終解釋,TempData值將在當前請求的末尾被刪除,因為它們在當前請求中被標記為刪除,並且只有在我們讀取時才會被標記為刪除。如果我們不讀它會發生什麼? 簡單的回答,在這種情況下,下一個請求也可以使用TempData。現在,如果TempData在下一次請求中被標記為刪除,那麼它將在下一次請求結束時被刪除,否則這個故事將繼續。 程式碼示例 隱藏,複製Code

public ActionResult M1()
{
   TempData["a"] = "Value";
   return view("MyView"); // TempData will be available inside view but let’s assume MyView won’t read the value
}

//Immediate next request after M1 made by end user
public ActionResult M2()
{
   string s = TempData["a"].ToString(); // TempData will be available and now its marked for deletion
   return view("MyView2"); // TempData will be available inside view also because request is not ended yet.
}

在上面的例子中, 終端使用者請求操作方法M1。它建立的TempData在整個請求中都是可用的,但是在M1和MyView中都不會讀取值,因此在請求結束時不會刪除值。接下來,假設終端使用者通過超連結或其他方式向M2 action方法發出新的請求。現在M1操作方法中建立的TempData也將在M2中可用。M2 TempData中的值將被讀取,因此將被標記為刪除。當前請求在終端使用者獲得最終響應後結束。在我們的例子中,終端使用者只有在檢視完成渲染後才能得到最終的響應。因此,TempData也將在檢視中可用。一旦檢視渲染完成,TempData就會被刪除。 保持和偷看方法 保持 Keep方法使TempData中的值為下一次請求持久化。 示例1 操作方法 隱藏,複製Code

public ActionResult M1()
{
   TempData["a"] = "Value";
   TempData["b"] = "Value1";
   TempData["c"] = "Value2";
   TempData.Keep();
   return view("MyView"); 
}

檢視 隱藏,複製Code

...
...
@{
   string s= TempData["a"].ToString();
   string s1= TempData["b"].ToString();
   string s2= TempData["c"].ToString();
}

在上面的示例中,所有三個TempData值也將對下一個請求可用。 示例2 操作方法 隱藏,複製Code

public ActionResult M1()
{
   TempData["a"] = "Value";
   TempData["b"] = "Value1";

   TempData.Keep();

   TempData["c"] = "Value2";
   return view("MyView"); 
}

檢視 隱藏,複製Code

...
...
@{
   string s= TempData["a"].ToString();
   string s1= TempData["b"].ToString();
   string s2= TempData["c"].ToString();
}

在上述樣本中,只有編號為“a”和“b”的TempData可用於下一個請求。鍵為“c”的TempData在當前請求結束時被刪除。 示例3 操作方法 隱藏,複製Code

public ActionResult M1()
{
   TempData["a"] = "Value";
   TempData["b"] = "Value1";
   TempData["c"] = "Value2";

   TempData.Keep("a");

   return view("MyView"); // TempData will be available inside view
}

檢視 隱藏,複製Code

...
...
@{
   string s= TempData["a"].ToString();
   string s1= TempData["b"].ToString();
   string s2= TempData["c"].ToString();
}

在上面的示例中,只有鍵為“a”的TempData在下一次請求中可用。 鍵為b和c的TempData將在當前請求結束時被刪除。 偷看 Peek將讓我們檢索TempData值不標記為刪除。 示例沒有偷看 隱藏,複製Code

public ActionResult M1()
{
    TempData["a"] = "Value";
    return RedirectToAction("M2");
}
public ActionResult M2()
{
    string s = TempData["a"].ToString(); //TempData will be marked for deletion
    return view ("Some View"); 
}
.
.
.
//Next request
public ActionResult M3()
{
    string s = TempData["a"].ToString(); // Will get an Exception
    …
}

在上面的例子中,TempData值(在操作方法M1中建立的)將不能用於下一個請求,因為它已經在當前請求中使用了(在操作方法M2中)。 當用戶向動作方法M3發出新的請求時,將丟擲空引用異常。 Peek的示例 隱藏,複製Code

public ActionResult M1()
{
    TempData["a"] = "Value";
    return RedirectToAction("M2");
}
public ActionResult M2()
{
    string s = TempData.Peek("a").ToString(); // TempData values will be read but will not be marked for deletion
    return view ("Some View"); 
}
.
.
.
public ActionResult M3()
{
    string s = TempData["a"].ToString(); // Will just work 
    …
}

在上面的例子中,TempData值在下一個請求中也是可用的。 避免ASP中的CSRF攻擊。NET MVC 現在,在我們學習避免它之前,我們先來了解一下它。 CSRF是跨站點請求偽造的縮寫。 在這裡,hacker將開發一個兩面的UI。兩面UI的意思是,UI會根據終端使用者做一些不同的事情但實際上它會做一些不同的事情。 為了更好地理解它,讓我們做一個小演示。 第一步-開放日7專案 開啟我們在第七天完成的專案 步驟2 -執行專案 按F5並執行專案。用管理員使用者完成登入過程。 步驟3 -建立偽造專案 開啟一個新的Visual studio。選擇檔案在祝辭新在祝辭專案。選擇Web section從左側面板和" Asp. "Net Web應用程式”從右。將其命名為“ForgeryProject”並點選確定。 選擇空模板和Web表單引用並單擊Ok。 (在本演示中,您正在建立這個偽造專案,但實時建立該專案的將是想侵入您的系統的其他人。) 步驟4 -建立下載電子書選項 在新建立的專案中建立一個名為DownloadEbook.html的HTML頁面,如下所示。 隱藏,複製Code

<!DOCTYPEhtml>
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
    <formaction="http://localhost:8870/Employee/SaveEmployee"method="post"id="EmployeeForm">
        <inputtype="hidden"name="FirstName"value="DummyFName"/>
        <inputtype="hidden"name="LastName"value="LName"/>
        <inputtype="hidden"name="Salary"value="35000"/>
        <inputtype="hidden"name="BtnSubmit"value="Save Employee"/>
        Congratulations!! You have won a free pdf of Learn MVC project in 7 days.
        Email : - <inputtype="text"name="Whatver"value=""/>
        <inputtype="submit"name="MyButton"value="Send Link"/>
    </form>
</body>
</html>

步驟4 -執行專案 按F5並執行應用程式。 解釋 你期望得到一個下載的pdf連結,但它實際上建立了一個新員工。 讓我們來了解一下到底發生了什麼。 終端使用者只有在他是經過身份驗證的管理使用者時才能建立員工。在我們的案例中,管理使用者將使用他的管理憑證登入,一段時間後,他將去並開啟一個新的瀏覽器例項(或瀏覽器標籤),並開始做一些衝浪。(記住他當前的會話是活動的,他仍然是我們的應用程式的認證使用者)突然上面的偽造頁面(由某些敵人建立)出現在他面前,他/她點選了“傳送連結”按鈕。“傳送連結”按鈕將實際傳送一個post請求到我們的應用程式。你知道接下來會發生什麼。 這被稱為CSRF攻擊。 解決這個問題的令牌。 在實際的資料輸入中,screen server將以隱藏欄位的形式注入一個祕密令牌。這意味著當從實際資料輸入螢幕發出post請求時,secret token將作為post資料的一部分發送。在伺服器端接收到的令牌將根據生成的令牌進行驗證,如果它們不是相同的請求將不被服務。 現在讓我們實現它的解決方案。 步驟1 -在原始資料輸入螢幕中注入令牌 CreateEmployee開放。從“~/Views/Employee”資料夾中的cshtml注入祕密令牌,如下所示。 隱藏,複製Code

<tdcolspan="2">
    @Html.AntiForgeryToken()
    <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>

步驟2 -在操作方法上啟用偽造驗證 將ValidateAntiForgeryToken屬性附加到EmployeeController的SaveEmployee操作方法,如下所示。 隱藏,複製Code

[AdminFilter]
[HeaderFooterFilter]
[ValidateAntiForgeryToken]
public ActionResult SaveEmployee(Employee e, string BtnSubmit)
{
   switch (BtnSubmit)
   {

步驟3 -檢查資料輸入螢幕中生成的令牌 按F5並執行應用程式。完成登入過程。導航到AddNew螢幕並檢查檢視源。 步驟4 -檢查偽造 保持專案登入開啟,並執行forgery專案,並執行與前面相同的測試。 現在是安全的。 MVC繫結和縮小 理解捆綁 我們無法想象一個沒有CSS和JavaScript檔案的專案。 捆綁是將多個JavaScript或CSS檔案組合到單個fileat執行時的概念。現在最重要的問題是為什麼我們要合併? 為了更好地理解這一點,讓我們做一個演示。 步驟1 -執行專案 再次執行我們的專案。在chrome中執行。 步驟2 -開啟chrome開發工具 在chrome中按“cntrl + shift + I”開啟開發工具。現在導航到“網路標籤” 步驟3 -開啟登入 現在請求登入頁面並再次檢查網路選項卡。 如果你還記得我們在登入檢視中實現了不顯眼的客戶端驗證,這需要三個JavaScript檔案。所以當登入檢視被請求時,它發出四個請求呼叫:- 一個用於登入檢視。三個請求JavaScript檔案" jQuery。js”、“jQuery.validate。js”和“jQuery.validate.unobtrusive.js”。 想象一下,如果我們有很多JavaScript檔案。這會導致多個請求,從而降低效能。 解決方案是將所有的JS檔案合併成一個包,並在一個請求中作為一個單元請求它。這個過程稱為捆綁。 我們將學習如何使用Asp執行繫結。淨MVC。 理解縮小 通過刪除空白、註釋等,縮小指令碼和CSS檔案的大小。下面是一個簡單的例子帶有註釋的JavaScript程式碼。 隱藏,複製Code

// This is test
var x = 0;
x = x + 1;
x = x * 2;

實現了縮小後,JavaScript程式碼如下所示。您可以看到如何刪除空白和註釋來最小化檔案大小,從而在減小檔案大小時提高效能。 隱藏,複製Code

var x=0;x=x+1;x=x*2;

在Asp中實現繫結和縮小。Net MVC 步驟1 -建立指令碼包 從App_Start資料夾中開啟BundleConfig.cs檔案。您將發現一個RegisterBundle方法。刪除其中的所有現有程式碼並重新定義它,如下所示。 隱藏,複製Code

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new ScriptBundle("~/bundles/jqueryValidation").Include(
                "~/Scripts/jquery-1.8.0.js").Include(
                "~/Scripts/jquery.validate.js").Include(
                "~/Scripts/jquery.validate.unobtrusive.js"));
}

步驟2 -在登入檢視中包含bundle 開啟登入。cshtml檢視從" ~/Views/Authentication "資料夾。 刪除三個指令碼檔案的引用,並將其包含在一個包中。 隱藏,複製Code

    <title>Login</title>
   @Scripts.Render("~/bundles/jqueryValidation")
</head>
<body>

步驟3 -執行和測試 執行應用程式並再次檢查network選項卡。 不幸的是,你不會發現任何不同。 步驟4 -啟用捆綁和縮小 開放的全球。asax檔案並在Application_Start事件的頂部放置下面一行。 隱藏,複製Code

BundleTable.EnableOptimizations = true;

步驟5 -執行和測試 再次進行同樣的測試。 正如您所看到的,被請求的是一個檔案,而不是三個。所有三個JavaScript檔案被打包成一個檔案。檢查尺寸。只有294B。早些時候是(289+294+310)。這證明了他的工作也縮小了。 (別忘了檢查驗證☻)。 同樣,我們為CSS檔案建立名為StyleBundle的包。 建立客戶助手類 它會是c#而不是Asp。淨MVC。 在本文中,我們將為submit按鈕建立一個自定義助手函式。 步驟1 -建立CustomerHelperClass 在專案中建立一個名為Extensions的新資料夾,並在其中建立一個名為CustomHelperMethods的新類。 步驟2 -使類成為靜態類 現在讓上面的類成為一個靜態類,因為這將是擴充套件方法的第一個要求。 隱藏,複製Code

namespace WebApplication1.Extenions
{
    public static class CustomHelperMethods
    {
    }
}

步驟3 -建立一個擴充套件方法 將using語句放在類的後面 隱藏,複製Code

usingSystem.Web.Mvc;

在上面的類中建立一個新的靜態擴充套件方法Submit,如下所示。 隱藏,複製Code

public static MvcHtmlString Submit(this HtmlHelper helper, string displayText)
{
    return MvcHtmlString.Create
        (
        string.Format("<inputtype='submit'name=Btn{0} id=Btn{0} value={0} />",displayText)
        );
}

步驟4 -更改登入檢視 從“~/Views/Authenticate”資料夾中開啟登入檢視,並將using語句放入如下檔案中。 隱藏,複製Code

@using WebApplication1.Extenions

現在刪除輸入型別submit,並放入以下程式碼。 隱藏,複製Code

...
...
@using (Html.BeginForm("DoLogin", "Authentication", FormMethod.Post))
{
    @Html.LabelFor(c=>c.UserName)
    @Html.TextBoxFor(x=>x.UserName)
    @Html.ValidationMessageFor(x=>x.UserName)
    <br/>
    @Html.LabelFor(c => c.Password)
    @Html.PasswordFor(x => x.Password)
    <br/>

    @Html.Submit("Login")
}
...
...

步驟5 -執行和測試 按F5並執行應用程式。檢查輸出。 MVC單元測試 為此,我們將不做一個完整的演示。我希望你把它當作任務。 供參考檢查以下文章。 http://www.codeproject.com/Articles/763928/WebControls 從MVC 5開始 如果你想開始與MVC 5開始與下面的視訊學習MVC 5在2天。 結論 非常感謝大家的精彩評論和反饋。 你的評論,郵件總是激勵我們做更多。把你的想法和評論寫在下面,或者傳送郵件到[email protected] 在Facebook, LinkedIn或twitter上聯絡我們,以保持最新的版本。 如需在孟買進行線下技術培訓,請訪問StepByStepSchools.Net 線上培訓請訪問JustCompile.com或www.Sukesh-Marla.com 玩得開心,繼續學習。我們將用一個新的系列☻再次會晤 本文轉載於:http://www.diyabc.com/frontweb/news1789.html