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

  • 相关阅读:
    【记录】百度统计监控博客园
    【织梦】网站地图创建和美化
    【IDE】JRebel热部署实现
    【字体图标】 Font Awesome字体图标如何使用?
    【Eureka】springCloud项目搭建
    java 服务定期卡顿、卡死,服务在运行没挂,日志疯狂打印,接口不能用
    idea springboot 无法启动 Unable to start EmbeddedWebApplicationContext
    POI导出xlsx
    mysql decimal设置默认值0 无效,设置后自动变为null(通过Navicat可视化工具操作)
    Log file ./ib_logfile2 is of different size 268435456 bytes than other log files 50331648 bytes!
  • 原文地址:https://www.cnblogs.com/Dincat/p/13456420.html
Copyright © 2020-2023  润新知