介绍 本文是“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天。 结论 非常感谢大家的精彩评论和反馈。 你的评论,邮件总是激励我们做更多。把你的想法和评论写在下面,或者发送邮件到SukeshMarla@Gmail.com 在Facebook, LinkedIn或twitter上联系我们,以保持最新的版本。 如需在孟买进行线下技术培训,请访问StepByStepSchools.Net 在线培训请访问JustCompile.com或www.Sukesh-Marla.com 玩得开心,继续学习。我们将用一个新的系列☻再次会晤 本文转载于:http://www.diyabc.com/frontweb/news1789.html