好好学习,天天向上!
Pages: 1/282 First page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Next page Final page [ View by Articles | List ]
Mar 28
最近因为项目的原因有看一些winform的东西,推荐《Windows Forms 2.0 Programming》蛮不错,有英文版,有中文版,书蛮旧的,不过写的蛮好,读来几个章节,收益良多,如果有朋友正学习winform,也可以看看
Mar 28
生活有如一场梦一样,不曾清醒,如幻,好像带着头盔开着电驴走在昏黄路灯的马路上,与身边的人和车一一错过,放映机一般,如此的过着,不知不觉人已经到了一定年龄,确实感觉整个人生只干了那么几件事情,没数一会就,甚至喝口水脑子里就过了一遍,非常惶恐这时间的力量,让人不知不觉的增加了年龄,却未能更多沉淀,有出世之心,却一直干入世之事情,惆怅在错乱的abcd,流连在一个个虚虚的现实中,忍俊不禁……


Mar 14
最近项目繁杂,电脑各个版本的vs ide都装了一把,可发现想做sql跟踪时打开SQL Server Profiler,死活没窗口,任务栏有程序,没有window界面,无意间发现一个方法可以解决

1、在任务栏右键调出 任务管理器
2、在SQL Server Profiler进程上右键选择“最大化”
3、在最大化的窗体上最小化后还是发现程序无法在任务栏点开,,这个时候不要最下话,点击移动窗口,缩放后最小化程序运行正常


Feb 16
https://my.oschina.net/u/1458120/blog/208857
Feb 12

熟悉IoC容器的都知道,在开发过程中,最郁闷的莫过于当你新增一个Service时,你需要对该Service进行注册,有的是使用代码注入,有的是XML配置注入,不管是哪种类型的注入,经常会出现开发人员忘记注入的情况,

如果你的页面是直接发送请求的,那么会得到类似于如下页面的错误:

image  <- _<-

 

如果该服务是用于AJAX请求实用的,那么你就悲剧了,因为页面只是没反应,只有查看错误日志了。

Feb 8
隐式代码表达式

就是一个标识符,之后可以跟任意数量的方法调用("()")、索引表达式("[]")及成员访问表达式(".")。但是,除了在"()"或者"[]"里面,是不允许空格存在的。

例如,下面是一些合法的Razor隐式表达式:

下面是一些非法的表达式,这些表达式只有部分("==>"之后的部分)会被Razor认为是表达式。

这是我们为什么需要另一个表达式语法:"@(...)"的原因,通过这个语法我们可以把任何想要的东西放到"()"里面,上面的例子用这个语法来表示就是:

而这种表示方法就是 显示代码表达式。
Feb 8
Feb 8
本文目的
我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index:


创建对应的强类型视图


运行一下,如果你的RP不是非常不好的情况下,会出现下面的结果:

Highslide JS

生成的是一个Email的链接。看一下email部分对应的html源文件:


对于不求甚解的人来说,这很正常啊,正常的就像1+1=2一样。但对于勤学好问的同学来说,问题来了。

为什么生成的是一个email链接,不是一个纯文本?

因为我用DataType指明了它是email!

那DataType是如何指导Model生成html的?

如果你对这些问题感兴趣,请你看下去。



Model的兄弟--ModelMetadata
      在介绍Model如何能在View中正常显示之前,不得不提一下他的兄弟ModelMetadata这个类。ModelMetadata实现对Model的一些特征进行描述(如Model的类型、Model的值,Model要显示的模板 ),并且实现了对Model的所有属性值进行描述(递归结构)。有了这个兄弟,Model才能知道如何在View中正常显示【注意:这里特指的是用HtmlHelper的系列扩展方法(如Display/DiaplayFor/EditorFor等)方法在View中显示。如果你是在View中直接取Model的值用html显示,你可以暂不用关心ModelMetadata。但!!不要觉得这样你就不用了解ModelMetadata了,因为MVC中还有一个核心与它息息相关---Model绑定与验证,所以我建议你还是先认识一下这位好兄弟】,让我们来看看这个兄弟长什么样:


      然而在MVC中默认使用的却不是这个类,而是它的子类CachedDataAnnotationsModelMetadata(其实中间还隔着一个CachedModelMetadata类,因为该类只是做了简单的封装,为了方便读者理解,在此省略)。CachedDataAnnotationsModelMetadata做的最主要的一件事情就是通过一系列的Compute函数得到Model上注解特性的值,并把这些值赋值到对应的属性。如下:


      注意代码中两个红色的部分,把Model的注解特性存在PrototypeCache里面,这样就可以通过反射得到注解特性的值了。比如文章开始处的DemoModel的属性Email对应的CachedDataAnnotationsModelMetadata对象中 DataTypeName最终被赋值为“EmailAddress”,等介绍完下一位重量级人物后,会详解具体调用过程。

ModelMetadata的创建者ModelMetadataProvider
我们还要来认识一位重量级的人物:ModelMetadata的创建者:


      它是一个纯抽象类。该类的第一级子类非常重要,看一下代码:


      注意红色的部分,正是因为有这样一个处理,用户就可以通过自已自定义扩展实现IMetadataAware接口,对ModelMetadata进行再加工处理。



      根据上面ModelMetadata讲解,我们知道,MVC中默认使用的是CachedDataAnnotationsModelMetadata这个类,于是对应ModelMetadataProvider的最终子类CachedDataAnnotationsModelMetadataProvider。

      当外部想通过GetMetadataForType来得到ModelMetadata时,内部会调用CreateMetadata,再根据原型模式调用CreateMetadataPrototype或CraeteMetadataFromPrototype实现最终创建过程:


       同MVC的路由表RouteTable一样,ModelMetadataProvider也有一个静态的ModelMetadataProviders变量Current来提供默认的ModelMetadataProvider。简化代码如下:


终极解密
知道了这两位重量级的大员后,现在我们回到文章开始的代码:

Html.DisplayFor(model => model.Email)
当View中执行这句时,执行HtmlHelper的扩展函数,正式进入漫长的生成MvcString旅程:
Highslide JS
http://www.cnblogs.com/DotCpp/

     【注意,这个图中代码是经过N重简化而来,实际调用流程复杂无比(全是在TemplateHelpers中跳转),函数参数多如牛毛,实在不忍让大家看的痛苦】

      红色线是程序执行的主流程,后来的执行主场景都是在TemplateHelpers里面完成。

      从黄色线可以看出ModelMetadata是通过调用ModelMetadata本身的静态函数FromLambdExpression--->GetMetadataFromProvider,最终由ModelMetadataProviders完成创建。

     再来看看桔黄色部分。MVC中有一个DefaultDisplayTemplates的类,存储了诸如Boolean/String/Html/Email等等数据类型的模板,MVC最终根据ViewData中的ModelMetadata.DataType的值找到对应的模板,最终完成HTML字符串的输出,作为WebViewPage.ExecutePageHierarchy的一部分(WebViewPage请参看:仅此一文让你明白ASP.NET MVC 之View的显示(仅此一文系列二))。



结语
      本文只是用了ModelMetadata的一个DataType属性做为例子,让你了解在Model中添加注解特性是如何被ModelMetadata使用的。还有其它很多Model注解特性(如ReadOnlyAttribute/RequiredAttribute/UIHintAttribute等等)都和该原理类似。

      其实ModelMetadata在view显示中的作用是有限的,因为很多开发人员都不喜欢用这种前台显示方式,尤其随着json的大量使用,与JQUERY等前台的完美结合。但它有属于它的舞台----Model绑定与验证,敬请期待!

     希望新手看的明白,老手多提意见。如果你觉得对你有帮助,请让更多人知道它:)
Pages: 1/282 First page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Next page Final page [ View by Articles | List ]