.Net Mvc框架知识点
一、实现Controller的依赖注入:
1.自定义继承DefaultControllerFactory 类的控制器工厂类并重写GetControllerInstance方法;(如:InjectControllerFactory)
2.在Global.asax文件中的Application_Start方法中注册该控制器工厂类,示例如下:
ControllerBuilder.Current.SetControllerFactory(new InjectControllerFactory());
二、在Action方法中添加ActionName特性实现为其指定别名,或者添加NonAction以表明该方法并不会被路由匹配到,可通过继承ActionMethodSelectorAttribute抽象类并重写IsValidForRequest方法实现类似HttpGet、HttpPost、HttpPut、HttpDelete 和 NonAction 等自定义Action方法选择器
三、导步Controller:继承自AsyncController抽象类,并自定义异步Action方法(异步方法有两种:一种是XxxAsync/XxxCompleted,二种是Task返回值),具体实现详见: ASP.NET MVC下的异步Action的定义和执行原理
四、基本过滤器如下,可以通过实现相应接口来自定义过滤器
五、在View上动态添加或处理内容
1.内联代码(代码片段):如 @{ .. }或<% .. %>
2.Html helper方法:生成单个或多个HTML元素,如 Html.Label,Html.Editor等
3.Section:在指定的位置插入创建好的一部分内容(类似ASP.NET PlaceHolder),如 @section sectionName{ ...}
4.Partial view:存在于一个单独的视图文件中,作为子内容可在多个视图中共享,如 Html.Partial、Html.RenderPartial
5.Child action,相当于一个包含了业务逻辑的UI组件。当使用child action时,它调用 controller 中的 action 来返回一个view,并将结果插入到输出流中,如 Html.Action、Html.RenderAction
六、HTML Helper扩展方法:可直接生成相应的HTML元素,主要分为如下几类
1.链接类:在System.Web.Mvc.Html.LinkExtensions静态类包含生成各种链接的扩展方法;
2.表单类:在System.Web.Mvc.Html.FormExtensions静态类包含生成From元素的扩展方法;
3.输入类:在System.Web.Mvc.Html.InputExtensions静态类包含生成各种输入元素的扩展方法;
4.多文本输入类:在System.Web.Mvc.Html.TextAreaExtensions静态类包含生成TextArea元素的扩展方法;
5.选择类:在System.Web.Mvc.Html.SelectExtensions静态类包含生成各种选择元素的扩展方法;
6.动态编辑器模板类:在System.Web.Mvc.Html.EditorExtensions静态类包含依据要指定的类型来动态生成表单成员元素方法;
若要自定义HTML Helper动态编辑器模板类,可按照MVC约定,在 /Views/Shared/EditorTemplates 文件夹下创建相应的局部视图文件,示例代码如下:
//定义的HTML HELPER模板方法:
@model MvcApplication1.Models.Role @Html.DropDownListFor(m => m, new SelectList(Enum.GetNames(Model.GetType()), Model.ToString())) //View中使用:
@model MvcApplication1.Models.User @Html.EditorFor(m => m.Role)
注意:模板类文件名需与成员类型名称相同,或在数据实体类中指定成员使用哪个类型自定义模板(如:[UIHint("Role")])
七、MVC视图中使用AJAX:
1.使用原生的Ajax或第三方类库(如:jQuery.ajax)
2. 使用 MVC Unobtrusive Ajax
A.在Web.config文件中配置启动 Unobtrusive Ajax(默认为启用)
<appSettings>
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
B.在调用的页面顶部引入相应的JS脚本文件,如下:
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
C.最后采用Ajax.BeginForm来包裹表单成员,并为Ajax.BeginForm设置相应的参数
整个示例代码如下:
ACTION代码:
public ActionResult Ajax()
{
return View();
}
public ActionResult GetPersons(string selectedRole)
{
IEnumerable<Person> persons = new[]{new Person(){FirstName="z", LastName="x",Role=Role.User},
new Person(){FirstName="z1", LastName="x",Role=Role.Admin},
new Person(){FirstName="z2", LastName="x",Role=Role.User},
new Person(){FirstName="z3", LastName="x",Role=Role.Admin},
new Person(){FirstName="z4", LastName="x",Role=Role.User}};
if (selectedRole != "All")
{
persons = persons.Where(p => Enum.GetName(typeof(Role), p.Role) == selectedRole);
}
return PartialView(persons);
}
VIEW代码:
//主视图Ajax
<h2>Ajax</h2>
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
<table>
<tbody id="result">
</tbody>
</table>
@using (Ajax.BeginForm("GetPersons", new AjaxOptions() { UpdateTargetId = "result" }))
{
<div>
@Html.DropDownList("selectedRole", new SelectList(
new[] { "All" }.Concat(Enum.GetNames(typeof(MvcApplication1.Models.Role)))))
<button type="submit">Submit</button>
</div>
}
//分部视图:GetPersons
@model IEnumerable<MvcApplication1.Models.Person>
@foreach (var p in Model)
{
<tr>
<td>@p.FirstName</td>
<td>@p.LastName</td>
<td>@p.Role</td>
</tr>
}
八、Model Binding(模型绑定): 是 HTTP 请求和 Action 方法之间的桥梁,它根据 Action 方法中的 Model 类型创建 .NET 对象,并将 HTTP 请求的数据经过转换赋给该对象。
A.Model Binder(模型绑定器),顾名思义,可以形象的理解为将数据绑定到一个 Model 的工具。
MVC 框架内置默认的 Model Binder 是 DefaultModelBinder 类。当 Action Invoker 没找到自定义的 Binder 时,则默认使用 DefaultModelBinder。默认情况下,DefaultModelBinder 从如下 4 种途径查找要绑定到 Model 上的值:
Request.Form,HTML form 元素提供的值。
RouteData.Values,通过应用程序路由提供的值。
Request.QueryString,所请求 URL 的 query string 值。
Request.Files,客户端上传的文件。
B.绑定到复合类型(嵌套关联类型、可索引的类型等)需注意视图中表单成员的元素名称name必需符合可关联、可索引,示例如下:
//MODEL
public class Person {
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Address HomeAddress { get; set; }
}
public class Address {
public string City { get; set; }
public string Country { get; set; }
}
//VIEW
@Html.EditorFor(m=> m.HomeAddress.Country)
//或
<input id="HomeAddress_Country" name="HomeAddress.Country" type="text" value="" />
//可索引类型的在VIEW写法
@Html.Editor("[" + i + "].Country")
//或
@Html.EditorFor(m => m[i].Country)
//或
<input name="[0].Country" type="text" value="" />
当然如果不想这么麻烦也可以自己实现ModelBinder 类,然后在ACTION方法中显式指定ModelBinder,如下:
public ActionResult Index([ModelBinder(typeof(CustomerModelBinder))]Person p)
{
return View();
}
九、Model验证的几种方法:
1.在Action方法中使用 ModelState 对Model对象的属性值自行判断合法性,如:
public ActionResult UpdatePerson(Person p)
{
if (string.IsNullOrEmpty(p.FirstName))
{
ModelState.AddModelError("FirstName", "FirstName is not allow null!");
}
if (string.IsNullOrEmpty(p.LastName))
{
ModelState.AddModelError("LastName", "LastName is not allow null!");
}
if (ModelState.IsValid)
{
//执行更新
}
return View();
}
2.在Model各属性上直接定义验证规则,然后DefaultModelBinder类会自动进行验证,如:
public class Person
{
[Range(1,int.MaxValue)]
public int PersonId { get; set; }
[Required(ErrorMessage="请输入姓")]
public string FirstName { get; set; }
[Required(ErrorMessage = "请输入名")]
public string LastName { get; set; }
[Required(ErrorMessage = "请完整输入地址")]
public Address HomeAddress { get; set; }
public Role Role { get; set; }
}
3.通过继承ValidationAttribute抽象类并重写IsValid方法来自定义验证特性类(如下示例),然后使用方法与方法2相同
public class MailAttribute:ValidationAttribute
{
public override bool IsValid(object value)
{
if(value==null) return false;
var regex = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
return regex.IsMatch(value.ToString());
}
}
//MODEL的某个属性设置:
[Mail(ErrorMessage="不是有效的电子邮箱地址")]
public string EMail { get; set; }
4.MODEL自验证:让MODEL类实现IValidatableObject接口,在Validate方法进行验证判断,然后DefaultModelBinder类会自动进行验证,如:
public class Computer:IValidatableObject
{
public string CPU { get; set; }
public string MB { get; set; }
public string MEM { get; set; }
public string HDD { get; set; }
public string Power { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var errors=new List<ValidationResult>();
if (string.IsNullOrEmpty(CPU))
{
errors.Add(new ValidationResult("CPU is not allow null!"));
}
if (string.IsNullOrEmpty(MB))
{
errors.Add(new ValidationResult("MB is not allow null!"));
}
if (string.IsNullOrEmpty(MEM))
{
errors.Add(new ValidationResult("MEM is not allow null!"));
}
if (string.IsNullOrEmpty(Power))
{
errors.Add(new ValidationResult("Power is not allow null!"));
}
return errors;
}
}
以上验证默认是在提交到服务器端后再进行的验证,也可以开启客户端验证或远程验证(实现原理都是基于AJAX),在此不再说明。 另:推荐个优惠券网站:http://ntaotao.com/ ~_~
.Net Mvc框架知识点的更多相关文章
- 【原创】三分钟教你学会MVC框架——基于java web开发(2)
没想到我的上一篇博客有这么多人看,还有几位看完之后给我留言加油,不胜感激,备受鼓励,啥都别说了,继续系列文章之第二篇.(如果没看过我第一篇博客的朋友,可以到我的主页上先浏览完再看这篇文章,以免上下文对 ...
- 程序员必懂:javaweb三大框架知识点总结
原文链接:http://www.cnblogs.com/SXTkaifa/p/5968631.html javaweb三大框架知识点总结 一.Struts2的总结 1.Struts 2的工作流程,从请 ...
- 最轻量级的前端Mvc框架backbone
最轻量级的前端Mvc框架backbone依赖最轻量级的库understore backbone并非将前端再次切分为mvc,而是分为了七大模块,分别是:Events.Model.Collection.R ...
- ASP.NET MVC C#知识点提要
ASP.NET MVC C#知识点提要 本篇博文主要对asp.net mvc开发需要撑握的C#语言知识点进行简单回顾,尤其是C# 3.0才有的一些C#语言特性.对于正在学asp.net mvc的童鞋, ...
- 通过Struts了解MVC框架,兼说如何在面试中利用Struts证明自己
虽然目前Struts MVC框架不怎么用了,但它确是个能帮助大家很好地入门Web MVC框架,而且,一些历史项目可能还用Struts,反正技多不压身,大家如果能在面试中通过项目证明自己Struts这块 ...
- MVC框架实例构建
转自:http://www.cnblogs.com/levenyes/p/3290885.html MVC全名是Model View Controller,是模型(model)-视图(view)-控制 ...
- Java Web自定义MVC框架详解 (转)
转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...
- 一个简单 Go Web MVC 框架实现思路
需要的知识点 为了防止你的心里不适,需要以下知识点: Go 基本知识 Go 反射的深入理解 使用过框架 Go Web 服务器搭建 package main import ( "fmt&quo ...
- 自己写一个java的mvc框架吧(一)
自己写一个mvc框架吧(一) 目录 自己写一个mvc框架吧(一) 自己写一个mvc框架吧(二) 自己写一个mvc框架吧(三) 自己写一个mvc框架吧(四) 写之前的一些废话 废话 1 (总是要先随便说 ...
随机推荐
- c++多线程基础5(future,async,packaged_task,promise)
以下内容整理自:https://www.cnblogs.com/my_life/articles/5401190.html future 是一个能从其他地方获取到一个值的对象,如果是在不同的线程中,则 ...
- Nginx 进行性能配置
总所周知,网络上我们购买的服务器的性能各不相同,如果采用 Nginx 的默认配置的话,无法将服务器的全部性能优势发挥出来,我们应该选择适合自己需求的配置. 当我们默认安装后 Nginx 后,我们便得到 ...
- 1. 时间复杂度(大O表示法)以及使用python实现栈
1.时间复杂度(大O表示法): O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n! ...
- eclipse创建Java项目时提示Open Associated Perspective?
在eclipse中,原先使用python进行编程,需要新建java项目时,会提示如下信息: 消息框内翻译如下: Open Associated Perspective? --开放关联视角? This ...
- Fast Matrix Operations UVA - 11992 线段树
题意翻译 有一个r行c列的全0矩阵,有以下三种操作. 1 X1 Y1 X2 Y2 v 子矩阵(X1,Y1,X2,Y2)的元素加v 2 X1 Y1 X2 Y2 v 子矩阵(X1,Y1,X2,Y2)的元素 ...
- pkg-config 切换opencv版本
查看当前版本 pkg-config --modversion opencv 在~/.bashrc最后添加如下内容: CMAKE_INSTALL_PREFIX=/usr/local/opencv3 ex ...
- 安装python发行版本,并用conda来管理Environments,Python,packages
简介:anaconda指的是一个开源的python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 因为包含了大量的科学包,Anaconda 的下载文件比较大(约 515 MB ...
- 【算法笔记】B1001 害死人不偿命的(3n+1)猜想
1001 害死人不偿命的(3n+1)猜想 (15 分)卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 (3n+1) 砍掉一半.这样一直反复砍 ...
- POJ_2010 Moo University - Financial Aid 【堆预处理】
一.题面 POJ2010 二.分析 堆预处理 首先可以考虑吧随便取一个点,判断两侧的最小的总费用是多少,然后相加判断是否满足条件.如果直接判断会超时,所以需要用大根堆预处理一下.先看从分数最小的往最大 ...
- HDU 6357.Hills And Valleys-动态规划(区间翻转l,r找最长非递减子序列)
题意:给一串由n个数字组成的字符串,选择其中一个区间进行翻转,要求翻转后该字符串的最长非降子序列长度最长,输出这个最长非降子序列的长度以及翻转的区间的左右端点 #include<bits/std ...