Ajax返璞归真 asp.net mvc (5) – Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test

[索引页]
[源码下载]

返璞归真 asp.net mvc (5) – Action Filter, UpdateModel, ModelBinder,
Ajax, Unit Test

作者:webabcd

介绍
asp.net mvc 之 Action Filter, UpdateModel, ModelBinder, Ajax, Unit
Test

  • Action Filter – 在 Controller 层对消息做过滤。怎么着促成自定义的
    Action Filter
  • UpdateModel –  依照参数自动为对象的特性赋值
  • ModelBinder – 定义怎么着绑定 Model,DefaultModelBinder 实现了
    IModelBinder ,其得以按照名称自动将参数赋值到对象对应的习性上
  • Ajax –  在 asp.net mvc 中使用 ajax
  • Unit Test –  在 asp.net mvc 中采取单元测试

示例
1、asp.net mvc 自带的 Action Filter 的演示
FilterDemoController.cs

Ajax 1using System;
Ajax 2using System.Collections.Generic;
Ajax 3using System.Linq;
Ajax 4using System.Web;
Ajax 5using System.Web.Mvc;
Ajax 6using System.Web.Mvc.Ajax;
Ajax 7
Ajax 8using MVC.Models;
Ajax 9
Ajax 10namespace MVC.Controllers
Ajax 11Ajax 12Ajax 13{
Ajax 14    // HandleError – 现身相当时跳转到 Error.aspx(先在指定的 view 文件夹找,找不到再在 Shared 文件夹下找)
Ajax 15    // 需要 web.config 配置 – <customErrors mode=”On” />
Ajax 16    [HandleError]
Ajax 17    public class FilterDemoController : Controller
Ajax 18Ajax 19    Ajax 20{
Ajax 21        // 每一个 Filter 都有一个 Order 属性,其用来指定 Filter 的实践顺序
Ajax 22
Ajax 23        // [NonAction] – 当前艺术为普通方法,不解析为 Action
Ajax 24
Ajax 25        // [AcceptVerbs(HttpVerbs)] – 调用该 Action 的 http 方法
Ajax 26        // HttpVerbs 枚举成员如下: HttpVerbs.Get, HttpVerbs.Post, HttpVerbs.Put, HttpVerbs.Delete, HttpVerbs.Head
Ajax 27
Ajax 28
Ajax 29        ProductSystem ps = new ProductSystem();
Ajax 30
Ajax 31
Ajax 32        // ActionName() – Action 的称呼。默认值同方法名称
Ajax 33        [ActionName(“Product”)]
Ajax 34
Ajax 35        // ValidateInput() – 相当于 @ Page 的 ValidateRequest, 用于验证请求中是否存在危险代码。可预防 XSS 攻击。默认值为 true
Ajax 36        [ValidateInput(false)]
Ajax 37        public ActionResult Details(int id)
Ajax 38Ajax 39        Ajax 40{
Ajax 41            var product = ps.GetProduct(id);
Ajax 42
Ajax 43            return View(“Details”, product);
Ajax 44        }
Ajax 45
Ajax 46        // ValidateAntiForgeryToken() – 防止 CSRF 攻击(需要视图页面中使用 Html.AntiForgeryToken())。原理:生成一个肆意字符串,将其同时写入 cookie 和 hidden,当 form 提交到 action 时,验证二者是否等于并且验证提交源是否是本站页面(详查 asp.net mvc 的源代码)
Ajax 47        // 拼 sql 的时候避免 sql 注入:使用 @Parameter 的艺术
Ajax 48        [ValidateAntiForgeryToken()]
Ajax 49        public ActionResult ValidateAntiForgeryTokenTest()
Ajax 50Ajax 51        Ajax 52{
Ajax 53            return Content(“ValidateAntiForgeryToken”);
Ajax 54        }
Ajax 55
Ajax 56        // OutputCache() – 缓存。Duration – 缓存秒数。VaryByParam – none, *, 四个参数用逗号隔开
Ajax 57        [OutputCache(Duration = 10, VaryByParam = “none”)]
Ajax 58        // [OutputCache(CacheProfile = “MyCache”)] – 通过配备文件对缓存做设置。可以参考 http://www.cnblogs.com/webabcd/archive/2007/02/15/651419.html
Ajax 59        public ActionResult OutputCacheDemo()
Ajax 60Ajax 61        Ajax 62{
Ajax 63            return Content(DateTime.Now.ToString(“yyyy-MM-dd hh:mm:ss”));
Ajax 64        }
Ajax 65
Ajax 66        public ActionResult HandleErrorDemo()
Ajax 67Ajax 68        Ajax 69{
Ajax 70            throw new Exception(“HandleErrorDemo”);
Ajax 71        }
Ajax 72
Ajax 73        // Authorize() – 验证。走的是 membership
Ajax 74        [Authorize(Users = “user”)]
Ajax 75        // [Authorize(Roles = “role”)]
Ajax 76        // Request.IsAuthenticated – 重回一个 bool 值,用于指示请求是否因此了印证
Ajax 77        public ActionResult AuthorizeDemo()
Ajax 78Ajax 79        Ajax 80{
Ajax 81            return Content(“Authorize”);
Ajax 82        }
Ajax 83
Ajax 84        // 自定义的 Action Filter 的 Demo
Ajax 85        [MyFilter()]
Ajax 86        public ActionResult MyFilterDemo()
Ajax 87Ajax 88        Ajax 89{
Ajax 90            return Content(“MyFilterDemo” + “<br />”);
Ajax 91        }
Ajax 92    }
Ajax 93}
Ajax 94

自定的 Action Filter 的实现
MyFilter.cs

Ajax 95using System;
Ajax 96using System.Collections.Generic;
Ajax 97using System.Linq;
Ajax 98using System.Web;
Ajax 99
Ajax 100using System.Web.Mvc;
Ajax 101
Ajax 102namespace MVC
Ajax 103Ajax 104Ajax 105{
Ajax 106Ajax 107    /**//// <summary>
Ajax 108    /// 自定义的 Action Filter,需要连续 ActionFilterAttribute
Ajax 109    /// </summary>
Ajax 110    public class MyFilter : ActionFilterAttribute
Ajax 111Ajax 112    Ajax 113{
Ajax 114        public override void OnActionExecuting(ActionExecutingContext filterContext)
Ajax 115Ajax 116        Ajax 117{
Ajax 118            HttpContext.Current.Response.Write(“OnActionExecuting” + “<br />”);
Ajax 119        }
Ajax 120
Ajax 121        public override void OnActionExecuted(ActionExecutedContext filterContext)
Ajax 122Ajax 123        Ajax 124{
Ajax 125            HttpContext.Current.Response.Write(“OnActionExecuted” + “<br />”);
Ajax 126        }
Ajax 127
Ajax 128        public override void OnResultExecuting(ResultExecutingContext filterContext)
Ajax 129Ajax 130        Ajax 131{
Ajax 132            HttpContext.Current.Response.Write(“OnResultExecuting” + “<br />”);
Ajax 133        }
Ajax 134
Ajax 135        public override void OnResultExecuted(ResultExecutedContext filterContext)
Ajax 136Ajax 137        Ajax 138{
Ajax 139            HttpContext.Current.Response.Write(“OnResultExecuted” + “<br />”);
Ajax 140        }
Ajax 141    }
Ajax 142}
Ajax 143

Details.aspx

Ajax 144Ajax 145<%Ajax 146@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage<MVC.Models.Products>” %>
Ajax 147
Ajax 148<asp:Content ID=”Content1″ ContentPlaceHolderID=”TitleContent” runat=”server”>
Ajax 149    Details
Ajax 150</asp:Content>
Ajax 151<asp:Content ID=”Content2″ ContentPlaceHolderID=”MainContent” runat=”server”>
Ajax 152Ajax 153    <%Ajax 154 Html.BeginForm(“ValidateAntiForgeryTokenTest”, “FilterDemo”); %>
Ajax 155    <%= Html.AntiForgeryToken() %>
Ajax 156    <h2>
Ajax 157        Details</h2>
Ajax 158    <p>
Ajax 159        <strong>ProductID:</strong>
Ajax 160        <%= Html.Encode(Model.ProductID) %>
Ajax 161    </p>
Ajax 162    <p>
Ajax 163        <strong>ProductName:</strong>
Ajax 164        <%= Html.Encode(Model.ProductName) %>
Ajax 165    </p>
Ajax 166    <p>
Ajax 167        <input type=”submit” name=”btnSubmit” value=”submit” />
Ajax 168    </p>
Ajax 169Ajax 170    <%Ajax 171 Html.EndForm(); %>
Ajax 172</asp:Content>
Ajax 173

2、应用 UpdateModel 的 Demo
UpdateModelController.cs

Ajax 174using System;
Ajax 175using System.Collections.Generic;
Ajax 176using System.Linq;
Ajax 177using System.Web;
Ajax 178using System.Web.Mvc;
Ajax 179using System.Web.Mvc.Ajax;
Ajax 180
Ajax 181namespace MVC.Controllers
Ajax 182Ajax 183Ajax 184{
Ajax 185    public class UpdateModelController : Controller
Ajax 186Ajax 187    Ajax 188{
Ajax 189        public ActionResult Details(string name, int age)
Ajax 190Ajax 191        Ajax 192{
Ajax 193            User user = new User();
Ajax 194
Ajax 195            // UpdateModel() 和 TryUpdateModel() – 系统依照参数自动为目的的特性赋值
Ajax 196
Ajax 197            base.UpdateModel(user); // 失败抛非常
Ajax 198            // base.TryUpdateModel(user); // 失利不抛非凡
Ajax 199
Ajax 200            ViewData.Model = user;
Ajax 201
Ajax 202            return View();
Ajax 203        }
Ajax 204    }
Ajax 205}
Ajax 206

Details.aspx

Ajax 207Ajax 208<%Ajax 209@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage<MVC.Controllers.User>” %>
Ajax 210
Ajax 211<asp:Content ID=”Content1″ ContentPlaceHolderID=”TitleContent” runat=”server”>
Ajax 212    Details
Ajax 213</asp:Content>
Ajax 214<asp:Content ID=”Content2″ ContentPlaceHolderID=”MainContent” runat=”server”>
Ajax 215    <h2>
Ajax 216        Details</h2>
Ajax 217    <p>
Ajax 218        <strong>UserId:</strong>
Ajax 219        <%= Model.ID %>
Ajax 220    </p>
Ajax 221    <p>
Ajax 222        <strong>Name:</strong>
Ajax 223        <%= Model.Name%>
Ajax 224    </p>
Ajax 225    <p>
Ajax 226        <strong>Age:</strong>
Ajax 227        <%= Model.Age%>
Ajax 228    </p>
Ajax 229</asp:Content>
Ajax 230

3、演示怎么样是 ModelBinder
ModelBinderController.cs

Ajax 231using System;
Ajax 232using System.Collections.Generic;
Ajax 233using System.Linq;
Ajax 234using System.Web;
Ajax 235using System.Web.Mvc;
Ajax 236using System.Web.Mvc.Ajax;
Ajax 237
Ajax 238namespace MVC.Controllers
Ajax 239Ajax 240Ajax 241{
Ajax 242    public class ModelBinderController : Controller
Ajax 243Ajax 244    Ajax 245{
Ajax 246Ajax 247        /**//// <summary>
Ajax 248        /// 路由过来的或者参数过来的,会活动地赋值到对象的附和的特性上
Ajax 249        /// 做这些工作的就是促成了 IModelBinder 接口的 DefaultModelBinder
Ajax 250        /// </summary>
Ajax 251        public ActionResult Details(User user)
Ajax 252Ajax 253        Ajax 254{
Ajax 255            base.ViewData.Model = user;
Ajax 256
Ajax 257            // ModelState – 保存 Model 的景色,包括相应的错误音信等
Ajax 258            if (!base.ModelState.IsValid)
Ajax 259Ajax 260            Ajax 261{
Ajax 262                foreach (var state in ModelState)
Ajax 263Ajax 264                Ajax 265{
Ajax 266                    if (!base.ModelState.IsValidField(state.Key))
Ajax 267                        ViewData[“errorMsg”] = state.Key + “/” + state.Value.Value.AttemptedValue + “<br />”;
Ajax 268                }
Ajax 269            }
Ajax 270
Ajax 271            return View();
Ajax 272        }
Ajax 273    }
Ajax 274}
Ajax 275

Details.aspx

Ajax 276Ajax 277<%Ajax 278@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage” %>
Ajax 279
Ajax 280<asp:Content ID=”Content1″ ContentPlaceHolderID=”TitleContent” runat=”server”>
Ajax 281    Details
Ajax 282</asp:Content>
Ajax 283<asp:Content ID=”Content2″ ContentPlaceHolderID=”MainContent” runat=”server”>
Ajax 284    <h2>
Ajax 285        Details</h2>
Ajax 286Ajax 287    <%Ajax 288 var model = ((MVC.Controllers.User)ViewData.Model); %>
Ajax 289    <p>
Ajax 290        <strong>UserId:</strong>
Ajax 291        <%= model.ID %>
Ajax 292    </p>
Ajax 293    <p>
Ajax 294        <strong>Name:</strong>
Ajax 295        <%= model.Name %>
Ajax 296    </p>
Ajax 297    <p>
Ajax 298        <strong>Age:</strong>
Ajax 299        <%= model.Age %>
Ajax 300    </p>
Ajax 301    <p>
Ajax 302        <strong>error:</strong>
Ajax 303        <%= ViewData[“errorMsg”] %>
Ajax 304    </p>
Ajax 305</asp:Content>
Ajax 306

4、使用 ajax 的 Demo

Ajax 307    <p>
Ajax 308        Ajax
Ajax 309        
Ajax 310        <script src=”http://www.cnblogs.com/Scripts/MicrosoftAjax.debug.js” type=”text/javascript”></script>
Ajax 311        <script src=”http://www.cnblogs.com/Scripts/MicrosoftMvcAjax.debug.js” type=”text/javascript”></script>
Ajax 312                       
Ajax 313        <br />
Ajax 314        
Ajax 315        <!– AjaxHelper 简要表明 –>
Ajax 316        <%= Ajax.ActionLink(
Ajax 317                “ProductId 为 1 的详情页”,
Ajax 318                “Details”,
Ajax 319                “Product”,
Ajax 320                new { id = 1 },
Ajax 321                new AjaxOptions { UpdateTargetId = “ajax” }
Ajax 322            )
Ajax 323        %> 
Ajax 324    </p>
Ajax 325    <div id=”ajax” />

5、在 VS 中做单元测试
ProductControllerTest.cs

Ajax 326using MVC.Controllers;
Ajax 327using Microsoft.VisualStudio.TestTools.UnitTesting;
Ajax 328using Microsoft.VisualStudio.TestTools.UnitTesting.Web;
Ajax 329using System.Web.Mvc;
Ajax 330
Ajax 331using MVC.Models;
Ajax 332using System.Collections.Generic;
Ajax 333
Ajax 334namespace MVC.Tests
Ajax 335Ajax 336Ajax 337{
Ajax 338Ajax 339    /**//// <summary>
Ajax 340    ///这是 ProductControllerTest 的测试类,意在
Ajax 341    ///包含所有 ProductControllerTest 单元测试
Ajax 342    ///</summary>
Ajax 343    [TestClass()]
Ajax 344    public class ProductControllerTest
Ajax 345Ajax 346    Ajax 347{
Ajax 348        private TestContext testContextInstance;
Ajax 349
Ajax 350Ajax 351        /**//// <summary>
Ajax 352        ///获取或设置测试上下文,上下文提供
Ajax 353        ///有关当前测试运行及其职能的音讯。
Ajax 354        ///</summary>
Ajax 355        public TestContext TestContext
Ajax 356Ajax 357        Ajax 358{
Ajax 359            get
Ajax 360Ajax 361            Ajax 362{
Ajax 363                return testContextInstance;
Ajax 364            }
Ajax 365            set
Ajax 366Ajax 367            Ajax 368{
Ajax 369                testContextInstance = value;
Ajax 370            }
Ajax 371        }
Ajax 372
Ajax 373Ajax 374        附加测试属性#region 附加测试属性
Ajax 375        // 
Ajax 376        //编写测试时,还可使用以下属性:
Ajax 377        //
Ajax 378        //使用 ClassInitialize 在运行类中的第一个测试前先运行代码
Ajax 379        //[ClassInitialize()]
Ajax 380        //public static void MyClassInitialize(TestContext testContext)
Ajax 381        //{
Ajax 382        //}
Ajax 383        //
Ajax 384        //使用 ClassCleanup 在运行完类中的所有测试后再运行代码
Ajax 385        //[ClassCleanup()]
Ajax 386        //public static void MyClassCleanup()
Ajax 387        //{
Ajax 388        //}
Ajax 389        //
Ajax 390        //使用 TestInitialize 在运行每个测试前先运行代码
Ajax 391        //[TestInitialize()]
Ajax 392        //public void MyTestInitialize()
Ajax 393        //{
Ajax 394        //}
Ajax 395        //
Ajax 396        //使用 TestCleanup 在运行完每个测试后运行代码
Ajax 397        //[TestCleanup()]
Ajax 398        //public void MyTestCleanup()
Ajax 399        //{
Ajax 400        //}
Ajax 401        //
Ajax 402        #endregion
Ajax 403
Ajax 404
Ajax 405Ajax 406        /**//// <summary>
Ajax 407        ///Index 的测试
Ajax 408        ///</summary>
Ajax 409        // TODO: 确保 UrlToTest 属性指定一个对准 ASP.NET 页的 URL(例如,
Ajax 410        // http://![](https://www.cnblogs.com/Images/dot.gif)/Default.aspx)。这对于在 Web 服务器上实施单元测试是不可或缺的,
Ajax 411        //无论要测试页、Web 服务或者 WCF 服务都是这般。
Ajax 412        [TestMethod()]
Ajax 413        [HostType(“ASP.NET”)]
Ajax 414        [AspNetDevelopmentServerHost(“C:\\MVC\\MVC”, “/”)]
Ajax 415        [UrlToTest(“http://localhost:2005/")\]
Ajax 416        public void IndexTest()
Ajax 417Ajax 418        Ajax 419{
Ajax 420            ProductController target = new ProductController(); // TODO: 伊始化为方便的值
Ajax 421            int pageIndex = 0; // TODO: 起初化为适当的值
Ajax 422
Ajax 423            ViewResult actual;
Ajax 424            actual = target.Index(pageIndex) as ViewResult;
Ajax 425
Ajax 426            Assert.AreNotEqual(actual.ViewData.Model as List<Products>, null);
Ajax 427        }
Ajax 428    }
Ajax 429}
Ajax 430

OK
[源码下载]

相关文章