ASP.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),在此不再说明。

 

转载于:https://www.cnblogs.com/zuowj/p/4772709.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux客户端无法绑定端口号,为什么Linux客户端的情况下不支持端口共用?

也不是不可以, 如果是socket的话只要设置端口复用就可以实现&#xff0c;随便写一段代码演示一下#/bin/pythonimport sysimport timeimport socketdef start_tcp_client(ip, port):#server port and ipserver_ip ipservr_port porttcp_client socket.socket(socket.AF_INET,…

基于Linux系统的手机,中国最新超算操作系统揭秘:基于Linux

世界第一超级计算机神威太湖之光亮相之后&#xff0c;令世界瞩目。这款超级计算机由中国自主研发&#xff0c;处理器采用64位国产260核CPU申威SW26010&#xff0c;性能几乎是天河2号的三倍&#xff0c;但总功耗反而更低。这款超算不仅有强悍无比的硬件&#xff0c;更有神通广大…

前端学习(1614):oracle数据库管理

导入表 del_data文件 hr_cre文件 第二步导入 hr_popul.sql 最后导入 查询语句 创建表myemp create table myemp(id number(10),name varchar2(20) ) 运行结果 oracle管理工具 创建表myemp1 create table myemp1(id number(10) )

Warning: Multiple build commands for output file /xxx

今天注意到这个问题&#xff0c;如下&#xff1a; 在这里找到了答案&#xff1a;http://www.cnblogs.com/weilaikeji/archive/2013/10/15/3369709.html 解决步骤&#xff1a; 1.选择你的工程 2.选择target 3.点击 Build Phases 4.展开Copy Bundle Resources 5.删除里面的刚才提…

oracle之基本的sql_select语句全

查看表有哪些列 desc employees; 运行结果 基本sql语句 查询全部列 查询特定列 注意事项 算数运算符 查询伪表 select 8*4 from dual 运行结果 --查询十二个月的工资并1000 select last_name,salary,12*salary1000 from employees 运行结果 --查询日期 select sysdate,sys…

oracle之基本的sql_select语句之课后练习

SQL*PLUS命令可以控制数据库吗? 否&#xff01;下面的语句是否可以执行成功 可以 select last_name , job_id , salary as sal from employees; 下面的语句是否可以执行成功 可以 select * from employees; 找出下面语句中的错误 标点符号需要是英文格式下的。 select…

oracle之基本的过滤和排序数据

--查询对应的列 大于5000 select employee_id,last_name,salary from employees where salary>5000 运行结果 --查询对应的日期 select last_name,hire_date from employees where hire_date7-6月-1994 --查询对应的日期 select last_name,hire_date from employees --wh…

HDU 3435 KM A new Graph Game

和HDU 3488一样的&#xff0c;只不过要判断一下是否有解。 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 #include <vector>6 using namespace std;7 8 const int maxn 1000 10;9 const int INF 0x…

linux qt getpid,[QTA] Android 动态注入原理分析

一、前言Android 的 UI 自动化测试可以通过注入式和非注入式分别实现&#xff0c;通过注入式可以更加方便地与应用进行交互。QTA 团队提供的 Android UI 自动化测试框架QT4A, 是通过动态注入的方式来获取被测应用的控件树信息等&#xff0c;从而达到自动化测试的目的。本文主要…

oracle之单行函数1

--全部小写 全部大写 全部首字母大写 select lower(ATGUIGUJAVA),UPPER(ATGUIGU Java),initcap(ATGUIGU Java) from dual -- 运行结果 --转换为小写查询 select * from employees where lower(last_name)king 运行结果 字符控制函数 --拼接 截取 长度 select CONCAT(h…

Canvas制作排序算法演示动画

tips: 形象化演示排序算法可以让初学者快速理解&#xff0c;比较好的例子&#xff1a;jun-lu的SortAnimate&#xff0c;旧金山大学的David Galles教授的算法演示课件。最近在看canvas&#xff0c;试着用jscanvas自己做了一个。 实现思路 获取输入字符串存入数组S[]中新建一个对…

oracle之单行函数2

--通用函数 --求公司员工的年薪 nvl 没有值代替 select employee_id,last_name,salary*12*(1nvl(commission_pct,0)) "annnal salary" from employees 运行结果 --输出department_id为空时候 没有部门 select last_name,nvl(to_char(department_id,99999),没有部门)…

Bootstrap中过渡效果(Transition)模态框插件的使用案例

通过使用模态框效果实现弹出框的登录效果&#xff1a; 效果图&#xff1a; <form id"formmodal" action"#"><h3>过渡效果&#xff08;Transition&#xff09;模态框插件的使用案例&#xff1a;</h3><!--按钮触发模态框--><but…

oracle之单行函数之多表查询

--多表查询 select employees.employee_id,employees.department_id,departments.department_name from departments,employees where employees.department_iddepartments.department_id; 运行结果 --多表查询 其他情况 select e.employee_id,e.department_id,d.department…

VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因此无法使用(VMware版本不兼容问题)

首先先修改.vmx文件 修改成你VM对应的版本号 然后修改.vmdk文件 同样修改成VM对应的版本号 接下来运行虚拟机会出现 不支持客户机操作系统"centos6-64", 请从"虚拟机设置"中"选项"选项卡上的"常规"页面选择一个客户机操作系统. 按照操…

打不开磁盘“D:\CentOS7\CentOS7.vmdk”或它所依赖的某个快照磁盘。

这主要是非正常关闭虚拟机造成的&#xff0c;未能锁定文件 虚拟机为了防止有多虚拟机共用一个虚拟磁盘&#xff08;就是后 缀为.vmdk那个文件&#xff09;造成数据的丢失和性能的削弱&#xff0c;每次启动虚拟机时会给每个虚拟磁盘加一个磁盘锁&#xff08;也就是后缀为.lck的那…

【转】 代理模式

原文链接&#xff1a;http://layznet.iteye.com/blog/1182924一、代理概念 为某个对象提供一个代理&#xff0c;以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口&#xff0c;这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、…