欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC小结之基础篇(二)

程序员文章站 2024-02-23 09:38:40
整理除了这个笔记,共享一下子,基本mvc的所有东西都介绍了,但是都是很基础的东西。本来打算一篇发表完的,但是发现东西有点多,所以分成了两篇文章,这是最后一篇了! 1.as...

整理除了这个笔记,共享一下子,基本mvc的所有东西都介绍了,但是都是很基础的东西。本来打算一篇发表完的,但是发现东西有点多,所以分成了两篇文章,这是最后一篇了!

1.asp.net mvc请求过程

  1ASP.NET MVC小结之基础篇(二)

2.controller

  (1) 控制器在asp.net mvc中扮演着处理客户端请求的角色

  1)必须实现system.web.mvc.icontroller接口

   ->通常直接继承system.web.mvc.controller类

  2)必须要以controller结尾

  3)通过不同的action来处理具体的客户端请求

3.action

  (1) 是指在继承了system.web.mvc.controller类中所定义的返回值的类型可以兼容

  (2)actionresult方法

复制代码 代码如下:

namespace mvcapplication.controllers
{
public class homecontroller:controller
{
public actionresult index()
{
viewbag.message="韩迎龙";
return view();
}
}
}

  (3)asp.net mvc3的actionresult

    ASP.NET MVC小结之基础篇(二)

  (4)注意事项

  1)能够通过url访问的action必须是公有(public)方法

  2)如果标记了[nonaction]属性,这不能通过url访问该action

  3)默认,action得方法名就是action名(通过url访问的名称),如有特殊需求也可通过[actionname("otheractionname")]标记出特定的action名

  4)我们可以通过[httppost][httpget]等来区分处理不同的请求动作的同名action

4.asp.net routing 路由,过滤器

  (1) asp.net routing模块(module)的责任是将传入的客户端(浏览器)请求映射为特定的mvc controller actions

  (2)路由机制

  1)路由引擎 -映射urls到controlller

复制代码 代码如下:

public static void registerroutes(routecollection routes)
{
routes.ignoreroute("{resource}.axd/{*pathinfo}");
routes.maproute(
"default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 url
new { controller = "home", action = "index", id = urlparameter.optional } // 参数默认值
);
}
protected void application_start()
{
registerroutes(routetable.routes);
}

  2)/products/detail/8

复制代码 代码如下:

routes.maproute(
"default", // 路由名称
"{controller}/{action}/{id}", // 带有参数的 url
);
public class productscontroller:controller
{
public actionresult details(int id)
{
return view();
}
public actionresult edit(int id)
{
return view();
}
}

5. mvc3中routing变更

  (1) 从system.web.routing3.5程序集中转移到了system.web 4程序集中,成为了基础服务的一部分。

  (2)在asp.net 4中routing的module被注册在根web.config中,不需要你在自己的应用程序中的web.config中另行注册了

  (3)urlroutingmodule处理的事件减少了一个,仅处理postresolverequestcache事件

  (4)httprequest新增加了一个requestcontext属性

  (5)增加了pageroutehandler,支持webform路由功能

  (6)routecollection中增加了4个mappageroute的重载方法,添加路由规则更方便了

6. routing好处

  (1) 可以方便的实现rest服务

  (2)url友好化,利于seo和增强用户体验

  (3)controller和action的调用规则可定制化,降低耦合,提高灵活性

7. 过滤器

  (1) filter是一种aop模式,能够对一系列操作进行横切干扰的手段,它很大程度解耦了依赖关系,让我们的代码更加简练,功能更加丰富

  (2)asp.net mvc中提供了4类filter接口

   1)iactionfilter

  2)iauthorizationfilter

  3)iexceptionfilter

  4)iresultfilter

  (3)asp.net mvc中提供了outputcacheattribute,handlerrorattribute,authorizeattribute等常用filter实现

  (4)filter的切入过程

  1)以actionfilter为例

      ASP.NET MVC小结之基础篇(二)

8. sp.net mvc3中的filter

  (1) 提供了全局注册filter功能

  (2)提供了对childaction的outputcache支持

  1)结合[childactiononly]使用

9. model

  (1) mvc中model主要负责维持数据状态,将数据从数据存储器中检索并传递给控制器,客户端传送过来的数据经过处理后再传回数据存储系统中,是mvc中较重的一层

  (2)asp.net mvc框架本身并不关心数据的存储系统,并通过一些额外的帮助类和model绑定机制简化了model的使用

  1)具备自绑定机制

   2)具备自验证机制

  (3)asp.net mvc3 model的改进

  1)asp.net mvc3 model主要改进了验证机制

   ->数据验证(data annotations)

   ->客户端验证(client validation)

   ->远程验证(remote validation)

  ->自验证(self validation)

  (4)数据验证

  1)通过system.componentmodel.dataannotations的方法集合进行验证,并对客户端验证产生一些便利影响

   2)可以通过继承validationattribute实现自定义验证的attribute

  (5)客户端验证

  1)使用jquery的验证插件

  2)jquery.validate.unobtrusive.mis.js实现客户端验证

   ->启用客户端验证

   <appsettings>

   <add key="clientvalidationenabled" value="true" />

   <add key="unobtrusivejavascriptenabled" value="true" />

  </appsettings>

  ->引用jquery

   <script src="http://www.cnblogs.com/scripts/jquery.validate.min.js" type="text/javascript"></script>

    <script src="http://www.cnblogs.com/scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>

   ->特殊的验证

@{

html.enableclientvalidation();

}

  (6)远程验证

   1)在model的中使用跟requiredattribute相似

   1)[remote("验证的action名","控制器名",errormessage="远程验证为未通过的错误消息")]

   2)注意

   1)用于远程验证的action必须是httpget的,post提交无效

   2)action返回的结果是jsonresult,不是直接返回布尔值

  (7)自验证

  1)在model中结合validationcontext和validationresult来提供验证

复制代码 代码如下:

 public ienumerable<validationresult> validate(validationcontext validationresult)
   {
   if(enddate<=startdate)
  {
   yield return new validationresult("结束时间必须大于开始时间");
   }
   }

10. 最佳实践

  (1) 分层设计

   1)多个项目

  2)分离关注点

  3)可替换的数据访问层

  (2)repository模式(业务层)

   1)将数据的增删改查(crud)操作封装到repository中

  2)业务逻辑/数据验证封装到service中

   3)controller调用respository和service

  (3)prg模式(方法)

   1)post

   2)redirect

   3)get

   4)prg模式是用来确保修改数据只发生一次

  (4)保持视图中代码量最小化

   1)视图中不要含有数据处理的逻辑代码

   2)视图中要避免包含大的代码块

   3)构建多个试图/局部视图

   4)使用适当的@helper和@function语法

  (5)跟神奇的字符串说"拜拜了"

   1)aspx模式

  @viewdata["message"]

  @viewdata["totalcount"]

   2)razor模式

  @model.message

   @model.totalcount

   3)尽量使用特定的model,而避免使用viewdata/viewbag

  (6)domainmodel(领域模型)!=viewmodel(视图模型)

   1)符合需求的最小化viewmodel

  1)有效验证

   2)高安全性

  3)高性能

  2)使用一些mapping工具,做双向映射填充

   1)automapper,emitmapper,valueinjecter

   2)自定义的orm-generpoint.orm

   3)使用专门的viewmodel填充逻辑,轻松解决国际化/本地化

  (7)使用新的ajax helper

  1)web.config中德appsettings

   <add key="unobtrusivejavascriptenabled" value="true">

   2)视图中引用jquery.unobtrusive-ajax.js

   3)视图中调用ajax helpers

   1)@ajax.actionlink("home","index",new ajaxoptions{updatetargetid="main"})

   2)<a data-ajax="true" data-ajax-mode="replace" data-ajax-update="#content" href="/">home</a>

  (8)视图中尽可能的写html代码

  1)尽可能写纯html代码

  2)不要为了隐藏html,而故意自定义html.submit之类的helper

  3)尽可能不使用webform控件做视图代码渲染

  (9)iis express 7.5

  1)具有完整的web服务器功能

   1)ssl

   2)网址重写

   3)可对<system.webserver>的配置进行本地测试

   4)iis7.x其他的模版集合

   2)轻量级

   1)<5m

   2)不需要管理员账户

  3)高性能

11. 关于性能优化的软实力

  (1) 了解http,cache,ajax各种基础知识

  (2)能够针对整体web执行环境进行分析与架构规划

  (3)能够设计出妥当的缓存策略

  (4)能够进一步针对网站性能进行数据话分析

12. 关于性能优化的硬功夫

  (1) 熟悉.net/c#/asp.net mvc框架与核心原理

  (2)能够进一步针对项目进行妥善规划,做好关注点分离设计

  (3)熟悉profiling技术,能够分析出个环节的性能瓶颈

  (4)能够针对各种环境进行代码优化,提升程序的执行性能

13. 决定web性能的关键要素

  (1) web性能优化基础-http

1)http是无状态的

2)一个网页包含了n次http请求

(2)分析网页打开时的http状态

1)fiddler

2)ie10 developer tools

(3)客户端优化

1)http请求次数减少

2)下载所使用的带宽

3)dns查询的时间长短

4)css显示的速度

5)javascript调用的速度

(4)服务端优化

1)iis

->控制客户端

http cache control

->控制服务器端

将数出缓存(output caching)

提升数据库查询速度

2)asp.net mvc

->调用性能改善

->适当的缓存策略

(5)[seesionstate]

1)使用sessionstate属性

控制controller访问阶段状态数据(session)的方式

2)注意:关闭session后不能在使用tempdata传递信息

(6)[outputcache]

1)html.action与html.renderaction支持output caching

->@{html.renderaction("actionname")}

->@html.action("actionname")

2)childaction终于支持outputcache属性

->[childactiononly]

->仅支持duration,varybycustom与varybyparam参数

->不能使用cacheprofile参数

(7)改变viewengine的默认设置

1)移除多余的viewengine以提升解析view的速度

->viewengines.engines.clear();

->viewengines.engines.add(new razorviewengine());

2)也可以通过这种方式变更载入view的顺序

->默认是webformviewengine优先处理

->viewengines.engines.add(new webformviewengine());

(8)避免闯入为null给视图(view)

1)html.textboxfor(m=>m.name)

->当传入null时会引发exception,但会被try/catch掉

->public actionresultinsert(){

return view(new products());

}

(9)关闭web.config的debug模式

1)<compilation debug="false" targetframework="4.0" />

基础篇就到这里了,下面的文章我们来些深入点的知识,大家期待下吧