关于Mvc与WebForm的优缺点在网上的评论可谓不胜枚举,但脱离了我们的项目来谈这些意义就不大了。以我们这次改版来看,WebForm的优势有以下几点:
一,可以使用<#include>,css、html与js可以实现跨页面乃至夸项目的重用,Mvc没有发现此类功能;
二,可以精确的调用用户控件中的属性、字段、函数并可以获得相应的返回值,Mvc也未发现此类功能;
三,可以方便的将公共或保护性字段属性函数等应用到aspx页面上,Mvc无法直接调用控制其中的相应字段属性等。
针对以上WebForm的有点或Mvc的确点,我们在改版商铺写字楼时遵循了下面的几个规范予以弥补:
一,使用局部视图来实现html的重用;
二,对控制器中所用到的属性字段函数进行合理的封装,如将原有的变量集成到一个大的类中作为一个强类型视图传递的对象传给相应的视图,实现在视图中的方便使用。在这里对于类的划分需要尽可能的把相关性比较高的放到一块儿,优先采用类的组合而非继承,若需要放到视图对象中的字段是一个较大的复合类,如经纪人实体或房源实体,建议单独存放在ViewBag中。这些做法的目的比一方面希望这些变量使用起来更加方便,另一方面减小在视图中调用局部视图或函数的时候传递参数的颗粒度,也就提高了这些局部视图或函数的重用性,如用经纪人实体做参数的函数我们既可以在商铺写字楼中用,也可以用在普通的经纪人详情页中使用,而视图对象做参数无法实现这点;
三,将代码的重用单位放到对象和函数上,原则上不在控制器中创建不直接向浏览器做交代的函数,而是放在底层以方便重用。
在遵循了上述一些规范之后方才发现Mvc还是有些优点的:
一,优秀的Razor引擎使得在视图中使用C#代码更加方便流畅;
二,单个视图可以对应多个控制器,提高了代码的重用;
三,在主视图的ViewBag或ViewData中存储的对象可以在局部视图(仅限通过RenderPartial方式渲染的视图)或母版页中使用;
四,可以在视图中以函数方式重用普通的html代码到局部视图中且可以向局部视图中传递一个对象;
五,视图与控制器的分界更加清晰,局部视图的重用可以直接在视图中予以调用,而在WebForm中用户控件在后台代码中由于需要传参绑定而无法放在底层实现更高的重用。
除了上面的异同,还有一些在WebForm与Mvc中名字相同的对象,这些对象虽然名字相同,但是类型已经不是一个类型了,如:
1 // 2 // 摘要: 3 // 为当前 HTTP 请求获取 System.Web.HttpRequestBase 对象。 4 // 5 // 返回结果: 6 // 请求对象。 7 public HttpRequestBase Request { get; } 8 // 9 // 摘要: 10 // 为当前 HTTP 响应获取 System.Web.HttpResponseBase 对象。 11 // 12 // 返回结果: 13 // 响应对象。 14 public HttpResponseBase Response { get; }
1 // 2 // 摘要: 3 // 获取请求的页的 System.Web.HttpRequest 对象。 4 // 5 // 返回结果: 6 // 当前与该页关联的 System.Web.HttpRequest。 7 // 8 // 异常: 9 // System.Web.HttpException: 10 // System.Web.HttpRequest 对象不可用时发生。 11 [Browsable(false)] 12 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 13 public HttpRequest Request { get; } 14 // 15 // 摘要: 16 // 获取与该 System.Web.UI.Page 对象关联的 System.Web.HttpResponse 对象。该对象使您得以将 HTTP 响应数据发送到客户端,并包含有关该响应的信息。 17 // 18 // 返回结果: 19 // 当前与该页关联的 System.Web.HttpResponse。 20 // 21 // 异常: 22 // System.Web.HttpException: 23 // System.Web.HttpResponse 对象不可用。 24 [Browsable(false)] 25 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 26 public HttpResponse Response { get; }
由于类型不同,在Mvc中一些特性不再灵验,如在controller里面不能识别Response.End()页面会继续运行下面的代码,可以用return null来代替。另外也添加了一些好玩的属性函数如Request.IsAjaxRequest(),该函数可以用来判断是否异步访问。但毕竟相应对象的类型依然共用一个基类,它们的大多数属性函数用法依然相同。目前对相应对象的各种新的用法了解还是很有限,需要在今后的工作中加以总结,以最大化的发挥出框架的优势。
就现在的改版来说,我们做的尚不够好,但依然可以发现,在MVC中我们用的代码更少,重用的地方更多了。其实无论是MVC还是WebForm只要能够合理的使用都可以获得较高的效率及可维护性,要想提高代码的可维护性及性能还是需要我们定制并完善统一的标准,同时也要提高我们的个人水平。