摘要:
很多时候在mvc项目中我们需要去扩展自己的视图引擎,大概看起来应该下面这个样子的: public class RazorEngineExpand : RazorViewEngine { private void SetAdmin() { AreaPartialViewLocationFormats = new[] { "~/Admin/Views/{2}/{1}/Shared/{0}.cshtml", "~/Admin/Views/{2}/Views/{... 阅读全文
摘要:
关于EF CodeFirst的文章院子里有很多的学习资料,但大多数都是一些讲Model通过特性或是Fluent API与数据库之间形成映射的关系,看了相关的文章之后,Model如何映射到数据还是有些迷糊,最近看了qouoww的这个系列文章http://www.cnblogs.com/qouoww/archive/2011/12/31/2309066.html,感觉不错,写下一个简单的demo作为总结,一起学习共勉。 既然是采用CodeFirst的方式来编程的话,那么首先很明显一点我们得自己定义一个数据库上下文对象,如下所示: public class BaseDbContext<TCon 阅读全文
摘要:
今天在vs2012上新建了一个mvc4的项目,mvc4中默认的Entity Framework是5.0的版本,如下所示:或者:,但是项目中有些要用到EF6.0的相关方法,用EF5.0实在繁琐,于是在Nuget中安装EF6.0:但是在安装的过程中遇到如下问题:我们可以看到出错的信息里面有一个“找不到与EntityFramework 6.0.0-betal“兼容的"ntityFramework.zh-Hans”版本。好吧,我们找到项目的packages.config文件,将上文第一幅图修改如下:再次用Nuget安装EF6.0,成功之后,我们再次打开packages.config文件:我们 阅读全文
摘要:
发现很久没有更新过博客了,写这些博客一方面是为了重温之前所学的知识,另一方面是为了锻炼自己的语言组织能力,大家都应该知道程序员都有一个通病,语言表达能力差,他可以连绵不绝的写出几千行的代码,但是如果要让他讲出来,估计讲不出10句话。好吧,就权当锻炼一下自己的语言组织能力吧。好了,废话不多说,我们这片文章就讲解一下mvc的关于利用标注特性做后台的数据验证吧。mvc中提供一个非常人性化数据验证方式--特性,即通过自定义的或是系统内置的特性标注在Model的属性上,而我们知道在ModelBinder的时候,在将参数绑定到具体Model之前回去解析应用在属性上的特性,正式利用这一特点,达到数据验证的. 阅读全文
摘要:
前面的文章中我们已经讲了三种的ModelBinder组件,在讲第四种ModelBinder组件之前,我想解释一下什么是ModelBinder,顾名思义就是模型绑定,就是浏览器发送Http请求时根据相关的数据创建对象的过程,比如我们每一次请求一个action的时候,创建这个action参数对象的过程就可以叫做模型绑定,因此我们可以认为ModelBinder就是生成匹配的action参数的值。 通过前面的文章介绍我们可以发现,mvc里面是有很多个ModelBinder,每一个ModelBinder可以绑定一个或是多个Model。当我们请求一个action的时候,会首先查找定义在action里面的. 阅读全文
摘要:
今天打开vs2012准备项目的开发,创建MVC4项目的时候莫名其妙的出现了如下的错误: 在网上找了好久没有找到答案,最后认真的看了一下报错的信息,估计是Nuget组件出了问题,于是在网上下载了nuget package manager安装包单独安装,再重新打开vs2012,终于可以了~~~鉴于自己被这个问题折腾了一下,便写下来,希望能帮到你。 阅读全文
摘要:
在之前的文章中我们讲过,在获取ModelBinder的时候优先选择的是应用在Action参数上的CustomModelBinder,具体的实现是在静态类ModelBinders里面的GetBinderFromAttributesImpl方法:private static IModelBinder GetBinderFromAttributesImpl(CustomModelBinderAttribute[] attrs, Func<string> errorMessageAccessor)我们在分析源码的时候可以看到ModelBinder有一个Binders属性,是对ModelBi 阅读全文
摘要:
在上一篇中我们讲到了应用在Action方法参数上述的ModelBinder,源码具体分析到:private IModelBinder GetModelBinder(ParameterDescriptor parameterDescriptor) { return parameterDescriptor.BindingInfo.Binder ?? Binders.GetBinder(parameterDescriptor.ParameterType); }我们已经讲了ReflectedParameterBindingInfo的Binder属性,假如它为空的话,则根据参数类型来获取ModelBi. 阅读全文
摘要:
我们继续我们MVC3源码的分析,我们在讲到MVC的过滤器的之前,我们讲到了Controller,Action和Parameter对应的描述对象ControllerDescriptor,ActionDescriptor,ParameterDescriptor,这三个对象中包含着控制器,方法,方法参数的一些相关信息,我们分析到类ControllerActionInvoker里面的InvokeAction方法里面的这一句代码://执行数据的绑定(参数的初始化)IDictionary<string, object> parameters = GetParameterValues(contr 阅读全文
摘要:
这一章我们主要来讲异常过滤器ExceptionFilter,废话不多说,mvc3中默认的异常过滤器特性类是HandleErrorAttribute,该类的主要主要成员有:public Type ExceptionType{get;set}public string View { get { if (string.IsNullOrEmpty(this._view)) { return "Error"; } return this._view; } set { this._view = value; } }public virtual void OnException(Exce 阅读全文
摘要:
上一篇讲到ActionFilter,这一篇我们来讲解ResultFilter,顾名思义,就是结果过滤器。和ActionFilter要实现抽象类ActionFilterAttribute里面的四个方法一样,我们自定义的ResultFilter的过滤特性类也要继承ActionFilterAttribute才行,同时实现接口IResultFilter里面的方法: public interface IResultFilter { void OnResultExecuting(ResultExecutingContext filterContext); void OnResultExecuted(Re. 阅读全文
摘要:
上一篇中我们随便聊了聊MVC的授权过滤器AuthorizeFilter,其实真正关于.net平台下的认证体系之复杂远远超出了我们的想像,对权限的控制我们只能找到相对安全的做法,并不能从绝对上杜绝不安全的验证,特别是对于.net下授权权限的控制。有机会我们可以回过头来深入的探讨有关.net平台下的权限控制体系。这一篇我们继续根据mvc3的源码来学习mvc的ActionFilter方法过滤器。 和AuthorizeFilter原理一样,所有要用在Action方法上的方法过滤器特性都必须继承抽象类ActionFilterAttribute,该类是实现了不仅实现了接口FilterAttribute,. 阅读全文
摘要:
在上一篇文章中,在讲完ActionDescriptor这个类之后,我们直接跳过了这一句代码: FilterInfo filterInfo = GetFilters(controllerContext, actionDescriptor);直接讲了ParameterDescriptor,现在我们回过头来看GetFilters方法返回一个FilterInfo实例,FilterInfo类里面的有如下成员:public FilterInfo(IEnumerable<Filter> filters) { var filterInstances = filters.Select(f => 阅读全文
摘要:
前面两篇文章中我们已经大概的讲解了一下ControllerDescriptor和ActionDescriptor这两个分别对应Controller和Action的描述对象,已经大概的知道他们包含的信息了。这篇文章我们将根据mvc3的源码继续往下看,在ControllerActionInvoker类中的InvokeAction方法中通过FindAction获取到ActionDescriptor之后,直接将代码贴上来吧:跳过中间的那些代码(稍后补充上),直接看这一句:IDictionary<string, object> parameters = GetParameterValues( 阅读全文
摘要:
上一篇我们在将ControllerDescriptor的时候,顺便提了一下该类里面的FindAction方法,这个方法返回的对象就是ActionDescriptor对象。顾名思义ActionDescriptor就是Action的描述对象,我们知道多个Action方法就组成了一个Controller集合,那么每一个Action就用ActionDescriptor来描述。老规矩我们先来看看ActionDescript里面的一些主要的成员吧:public abstract string ActionName {get;}public abstract ControllerDescriptor Co. 阅读全文
摘要:
在上一篇讲完Controller对象创建,我们知道Controller对象是在MvcHandler里面的ProcessRequest方法里面调用的ProcessRequestInit来完成的,因此所有的初始化工作准备完成之后,开始执行Controller的激活工作。Controller的激活执行的是接口IController里面的Execute方法,该方法定义如下: public interface IController { void Execute(RequestContext requestContext); }而最终的执行是在类Controller里面的ExecuteCore方法,该. 阅读全文
摘要:
在上一篇文章中我们获取到包含Controller所在的命名空间等信息的ControllerType对象之后,这篇就开始讲创建Controller对象。在DefaultControllerFactory中获取到ControllerType之后,紧接着就是创建Controller对象。 Type controllerType = GetControllerType(requestContext, controllerName);IController controller = GetControllerInstance(requestContext, controllerType);GetCon. 阅读全文
摘要:
为什么要讲ControllerType?其实刚开始的时候并没有讲这个ControllerType的打算,但是在看mvc源码的时候,心里老是有个疙瘩,一直在琢磨ControllerType的含义,随着研究的深入才慢慢发现它的真正含义。ControllerType是出现在MvcHandler创建控制器的时候用到的: controller = factory.CreateController(RequestContext, controllerName);factory就是默认的DefaultControllerFactory的对象,我们可来看看CreateController的定义:public. 阅读全文
摘要:
发现只要涉及到对象的创建,都很喜欢用工厂模式来解决耦合性的问题,微软从最初的PetShop4中就大量的使用了工厂模式+反射的技术解决模块之间的耦合性问题,屡试不爽。无论是WebForm模式下还是mvc模式下,我们随处可见到各种各样的工厂模式创建对象。但是在一篇文章呢,我们来讲mvc中这个用来创建各种各样对象的工厂是如何创建的。 我们首先回到之前我们讲到的那个MvcHandler类,里面有一个出处理请求初始化的方法ProcessRequestInit,我们来看看这个方法里面主要涉及到获取Controller工厂的代码:private void ProcessRequestInit(HttpCo. 阅读全文
摘要:
在mvc中Controller与View之间的传值与WebForm模式下页面之间的传值大同小异,都有Form表单,URL以及AJAX发送异步请求的传参方式,那么我们在这一篇文章中,我们主要讲解MVC中区别于WebForm的一些传值方法。 首先我们看看mvc中以ViewData方式来进行Controller于View之间的传值。二话不说,我们直接来个Demo看看效果:我们自定义一个TestViewData控制器,该控制器里面的方法如下:public class TestViewDataController : Controller{ public ActionResult Index() { . 阅读全文
摘要:
在前面两篇文章中,我们仅从mvc源码的层次上解析了mvc执行的一些前期准备工作,那么这一篇文章我们将再次深入的探讨一个HTTP请求如何在IIS服务器以及.Net FrameWork环境中被解析并返回给客户端。在处理客户端请求的时候,这里会涉及到两个模块:IIS服务器和.net FrameWork环境。IIS服务器是运行在非托管的环境下,Asp.net管道则是在托管环境下的,两者之间通过ISAPI接口连通在一起。我在前面也讲过mvc其实走的也是asp.net管道,只不过是让UrlRoutingModule 实现了IHttpModule接口,并在Init中注册了PostResolveReques. 阅读全文
摘要:
mvc虽然开源了,但是mvc核心的路由注册机制微软并没有公开,因此在开源的mvc源码中我们并不能完全的分析到mvc的路由注册原理,我们必须借助反编译工具来查看路由的注册。我们在新建一个mvc项目的时候,在全局文件Global.asax进行初始化的时候都会有一个注册路由的RegisterRoutes方法,该方法具体如下:public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.IgnoreRoute(& 阅读全文
摘要:
在第一篇博文中我已经具体的介绍了asp.net WebForm的传统编程方式的核心流程,由此可以知道asp.net是基于管道(即由20个事件组成,其中19个事件向程序员公开)设计的,因此具有很好的扩展性。而mvc的框架正是基于asp.net的良好的扩展性来实现。稍微理解asp.net核心的人都应该清楚,asp.net的扩展点主要体现在过滤器HttpMoudler和处理器HttpHandler这两个核心的组件。正是基于自定义的这两个组件来实现了mvc的框架。 如何对asp.net进行扩展呢?我们知道在asp.net的webForm与asp.net的mvc的编程中有一个很大的区别在于mvc方式客. 阅读全文
摘要:
这两者的区别,我想熟悉asp.net的人都应该清楚,但是我想说的是有时即使你能把get与post的区别说的比教科书还牛逼,但一旦到了真正的项目实战中,估计你还是会习惯性的忽略这一点。譬如我在项目中正是由于习惯性的忽略而整整浪费了将近三天的时间。这两者的区别在这里我不多说,就讲一下我在项目中遇到的有关get与post请求的问题吧~~~公司项目中有个上传文件的功能,支持多文件上传。文件的编号是由后台随即生成的GUID来作为标识的。在后期测试的过程中,发现一个很奇怪的问题,同时上传文件时,这些一起上传的文件会自动存放在一个由此次上传操作而创建的一个文件夹里面。在数据库可以发现这些文件的一个标识都是. 阅读全文
摘要:
今天公司开会刚好看到冯经理给我们演示的jq的时候,偶尔瞥到公司项目中也有用到jsonP技术来解决跨域请求的问题,一时兴趣大增,幸好之前有过研究,这次就做一次简单的复习吧。刚好今天发现EF不同版本之间还是有许多的不一致的地方,导致今天在用vs2012+mvc4+EF进行项目框架搭建的时候,老是找不到之前在vs2010中常用的方法类库,因此重装vs2010,这是一个漫长的过程,够我写一下jsonP的技术要点了~~~ JsonP是一个非官方的“协议”。主要用来跨域访问数据,使用的是服务器获得浏览器上的某个JS方法名称,并准备好Json数据,构造出一个调用js方法的js语法字符串。返回给浏览器。返回. 阅读全文
摘要:
上周五,看了一下公司一个项目的框架,虽然刚开始看的时候有些云里雾里的,但经过一天的潜心研究,慢慢的倒有些眉目了(还得花上几天的时间才能真正了解大师们的杰作)。在IT公司里面应该普遍都有一个这样的开发原则:开闭原则,通俗的讲就是尽量不修改原来的代码的基础上扩展新的功能方法。特别是在不同的公司之间,需要对另外的公司提供的类进行扩展的时候,就需要使用到扩展方法了,因为另外一个公司不可能把他做的类库全部给你看。连看一个最简单的例子: 假如你在业务层BLL的一个BllClass类中定义了一个方法: public string SayHello() { return "大家好~~我是hellok 阅读全文
摘要:
在面试的过程中,会遇到一些公司偶尔问道asp.net的整个运行机制的问题。下面我就来看看asp.net的整个的运行原理吧-------(在邹大牛的基础上加上个人的理解)。 首先你得知道:当你在浏览器中地址栏里面敲了一个你要访问的地址之后,“其实就相当于你通过 浏览器 去访问一台电脑上访问文件一样,只不过浏览器 的访问请求是由被访问的电脑上的一个 WEB服务器软件 来接收处理,它会分析接收到的请求信息,从而按照请求信息来找到服务器电脑上的文件,经过处理,最终将生成的内容发回到浏览器。”(摘自邹大牛)。看到这里的时候,也许有点绕了,什么浏览器,什么web服务器软件,其实说白了:浏览器和服务器就是. 阅读全文