随笔 - 19  文章 - 0  评论 - 5 
  2010年8月8日

  今天在自己的机器上安装VS2008遇到了许多问题,首先在编译时出现了“ 未找到编译器可执行文件 csc.exe”,实际csc.exe是存在的,然后再添加类库时又出现了"无法识别工具版本3.5"的问题。搜索了 未找到编译器可执行文件 csc.exe”没有找到什么可行的解决方案,大家都提议重装VS或重装系统,实在无语。

当然最终还是找到了解决方案,记录一下,希望有遇到的同学可以搜索到,免得浪费太多时间。

 

解决方案:

 

在注册表中建以下内容:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild]

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\3.5]
"DefaultToolsVersion"="2.0"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\2.0]
"MSBuildToolsPath"="C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\3.5]
"MSBuildToolsPath"="C:\WINDOWS\Microsoft.NET\Framework\v3.5\"

posted @ 2010-08-08 11:14 collinye 阅读(555) 评论(1) 编辑
  2010年8月4日

我的团队当前正在从事的工作之一就是为ASP.NET添加一个新的视图引擎。

一直以来,ASP.NET MVC都支持 “视图引擎”的概念—采用不同语法的模板的可插拔模块。当前ASP.NET MVC “默认”的视图引擎是ASP.NET Web窗体使用的.aspx/.ascx/.master文件模板。而当今其他一些流行的ASP.NET MVC视图引擎还包括SparkNHaml

我们正在打造一个新的视图引擎,它是一个在HTML生成方面进行优化,采用专注于代码的模版解决方案。它的开发代号是“Razor”,第一个beta版本很快就会发布出来。

设计目标

在设计和评估“Razor”时,我们牢记以下几个目标:

· 紧凑、富有表现力和流畅:Razor尽量减少一个文件里需要敲入的字符数,给你畅快淋漓的编码体验。与大部分模板的语法不同,你不会因为需要在HTML中标注服务器端代码块而中断敲代码的快感。代码分析器足够聪明,能够从你的代码里推断出是否为服务器端代码。这使得其简洁、富有表现力的语法输入能够干净,快速,有趣。

· 上手快: Razor非常容易上手,你只需要了解很少的新东西就可以掌握它,使用你现有的编程语言和HTML知识就足够了。

· 不是一个新的编程语言:我们尽量避免为Razor创建一个新的命令式语言。相反,我们希望让程序员只使用现有的C#/VB(或其它)编程语言知识就能使用Razor,我们只不过在你选择的编程语言里,提供一个非常棒的基于模板生成HTML的标记语法。

· 可以使用任何文本编辑器编写:Razor不要求什么特别的工具,使用老古董的文本编辑器也可以高效编程(“记事本”就不错)。

· 很好的智能感应输入提示:虽然Razor不是专为某个工具或者代码编辑器设计的,但它在Visual Studio里还是有很赞的智能提示功能。我们将会升级Visual Studio 2010和Visual Web Developer 2010使得它具有完整的编辑器智能提示功能。

· 便于单元测试:新的视图引擎支持对视图执行单元测试,不需要控制器(controller)或者Web服务器,而且可以包含在任意的单元测试项目中—不需要单独的应用程序域(App-Domain)。

过去几个月,我们一直在用Razor来编写程序,并邀请了一些志愿者(包括好几组非.NET的 Web程序员)来做易用性研究。使用过它的人对它的评价都不错。

弹性的选择空间

ASP.NET最赞的地方之一就是大部分组件都是可插拔的。如果你发现有一个组件不好用,随时都可以换成另外一个。

ASP.NET MVC的下一个版本将会包括一个新的“添加->视图”对话框,它让你可以方便地在创建新的视图模板文件时选择你想要使用的语法。它还便于你选择任一个安装在机器上的视图引擎—选择你感觉最自然的视图方案:

image

Razor将会是ASP.NET MVC内置的视图引擎之一。所有的视图辅助(helper[i])方法和编程模型特性同时支持Razor和.ASPX视图引擎。

你还将可以在单个站点或程序中混合使用多个视图引擎写的视图模板。比如说,你可以编写一些视图,有些用.aspx文件,有些用.cshtml或者.vbhtml文件(分别是Razor的C#和VB版本的文件后缀名),而另外一些用Spark或者NHaml。你还可以在采用一种视图引擎的视图模板里包含用另一种引擎编写的局部视图模板。总之,你有灵活的选择空间。

Razor版的“Hello World”

Razor允许你从静态的HTML页面(或者任意的文本内容)开始,添加服务器端代码使其变成动态页面。Razor的一个核心设计理念就是使编码过程更加流畅,并且只要最少的按键次数就能快速地在HTML标记中添加服务器端代码。

让我们来创建一个简单的例子:“hello world”,它的最终输出如下图所示:

image

使用.ASPX“代码碎块[ii]”的方式编写

如果用现有ASP.NET的.ASPX标记语法来编写上面的“Hello World”示例的话,我们需要在HTML标签中使用”<%= %>”来标记“代码碎块”:

image

仔细观察就可以发现上例中每一个代码碎块都需要5个字符(”<%= %>”)来标明代码的开始和结束位置。而且其中还有几个字符在键盘上不是特别好敲到(特别是“%”键—它位于大部分键盘的中上部)。

使用Razor的语法编写

在Razor中,你只需要用一个”@”字符就可以标识代码块的开始,与”<% %>”代码碎块不一样,Razor不需要你显式指明代码块的结束位置:

image

Razor分析器懂得代码块中使用的C#或VB的语法—这就是为什么上例中我们不需要显式关闭代码块的原因。Razor可以自动识别出上面的语句是独立的代码块并悄悄地为我们关闭它们。

看看,即使是像“hello world”这样微不足道的例子就为我们节省了12次键盘敲击。而且在键盘上”@”字符还比”%”字符更容易按,敲起来更快也更流畅。

循环和内嵌HTML示例

让我们来看看另外一个简单的场景,比如说要列出一些商品(并在每样商品旁标明价格):

image

用.ASPX”代码碎块”编写

如果用ASP.NET现有的.ASPX标记语法,我们可能需要写类似下面的代码来动态生成一个<ul>列表,里面包含表示每个商品的<li>元素:

image

使用Razor语法

下面是生成同样输出的Razor版本的代码:

image

请注意上面”@”符号是如何开始一个“foreach”循环,并在循环内嵌入一行包含代码块的HTML语句的。因为Razor分析器知道我们在代码块里用的C#语法,它可以识别出<li>标签里的内容应该被包含在foreach代码块中,并循环处理它们。它甚至还知道末尾的“}”结束foreach循环。

Razor很聪明,还能识别出<li>标签内的@p.Name和@p.Price是服务器端代码—并且在每次循环时执行它们。另外请留心Razor在HTML和代码混合的情况下,还能推导出@p.Name和@p.Price代码块的结束位置。

不需要在你的模板中添加许许多多打开/关闭标记来编写代码的感觉果然是酣畅淋漓。

If代码块和多行语句

下面是其他几个常见的场景:

If语句

跟上面的foreach示例一样,你可以在if语句中直接嵌入内容(或其他C#或者VB语言元素),而不需要显式指明代码块的开始和结束位置。例如:

image

多行语句

你可以像下面这样,使用“@{ 代码 }” 标注多行语句:

image

请注意上例中,变量可以被多个代码块引用—变量“message”在包含多行语句的“@{}”块中定义,但也可以被@message代码块使用。这个跟.aspx文件里的”<% %>”和”<%= %>”的语法类似。

多符号语句

“@()”语法允许代码块中有多个符号,例如,我们可以把上例中连接字符串和数字的代码使用”@ ()” 代码块这样重写:

image

集成代码和内容

Razor解析器内置了很多语言智能—脏活累活帮你做。

在HTML里,它会不会影响”@”符号在电子邮件地址和其他地方的用法?

大部分情况下,Razor解析器都有足够的能力推导出模板里的一个“@”字符到底是在代码中用到,还是在静态内容中用到。例如,我在下例中的邮件地址中使用了”@”字符:

image

当解析文件时,Razor会分析”@”字符右边的内容来判断它到底是代码(如果是CSHTML文件的话那就是C#代码,而如果是VBHTML文件的话那就是VB代码)还是静态文本内容。上例中的代码会输出以下的HTML(邮件地址被当作静态内容输出,而@DateTime.Now就被当作代码执行了):

image

如果碰到和代码一样格式的内容(或者你想把代码当作内容看待),你可以显式地打@@来用另外一个”@”字符进行转义。

识别内嵌的内容

当在一个if/else,foreach或者其他块语句中内嵌HTML文本时,可以考虑用一个HTML或XML标签将嵌套内容环绕起来,这样可以更清楚地标明一个文本内容块的开始。

例如,下例我使用<span>标签包围多行文本内容,而文本里还有一个代码块:

image

在客户端的显示结果如下—注意那个<span>标签:

image

如果你不想在显示文本内容时,把外面的标签也输出到客户端,那可以考虑使用<text>将嵌套内容括起来:

image

上面的代码在客户端的输出结果如下—请注意外面的<text>标签没有被输出:

image

HTML编码

默认情况下,”@”语句块生成的内容会自动HTML代码进行过滤和转换[Yimin1] ,用来更好地防范XSS垮站脚本攻击。

版面设计/母版页的情况—基础篇

在站点中保持一致的页面观感风格非常重要。ASP.NET 2.0引入了“母版页面(master page)”的概念,就是用来帮助在使用基于.aspx的页面或模板时实现这个功能。Razor同样也支持这个概念,它用的是“版面设计页面(layout pages)”—你可以先定义一个通用的站点模板,然后在站点其他视图或页面继承模板定义的统一观感。

版面设计的一个简单示例

下面是一个简单的版面设计页面示例,文件将会被保存为“SiteLayout.cshtml”。它包含了所有要放在页面里的静态HTML文本内容和动态的服务器端代码。接着我们添加了一个名为“RenderBody()”的辅助函数,放在模板中需要根据所请求的URL而“填入”具体内容的地方:

image

接下来我们再创建一个名为“Home.cshtml”的视图模板,它只包含了必要的文本内容和代码来构成所请求页面的具体内容,外围的内容则由版面模板提供:

image

请留意上面在Home.cshtml文件中我们怎么来显式地设置“LayoutPage”属性。它指明了我们期望用SiteLayout.cshtml作为这个视图的版面设计模板。我们还可以在ASP.NET MVC 控制器(Controller)调用Home.cshtml这个视图模板的时候,可以指定这个版面设计文件,或者将其配置为站点默认的版面设计模板(这种情况下,我们只需要在项目中的一个文件中指定它,而所有的视图模板都会自动采用它)。

当我们将Home.cshtml作为一个视图模板显示时,它会合并版面设计页和子页面的内容,然后将下面的内容发送到客户端:

image

简洁、清晰、富有表现力的代码

上例中值得注意地方的还有一点,就是版面定义和在视图/页面中使用它们的语法既清晰又简练。上面列出的SiteLayout.cshtml和Home.cshtml代码截图已经包含了两个文件所有的代码—没有额外的配置步骤或冗余的标签,没有<%@ Page %>前缀,也不需要设置其它的标签或者属性。

我们尽力使编写出来的代码简洁流畅。我们还希望任何人都可以在一个文本编辑程序中打开、编辑和调整/自定义它们。不需要代码生成或者智能提示(Intellisense)。

版面设计页面/母版页的情况—覆写部分内容

版面设计页面可以有选择性地定义几个不同的“节”,允许基于这个版面设计的视图模板通过“填入”自定义的内容来覆写它。这就允许你在视图中覆写版面设计页里不连续的内容段落,从而使你的站点版面设计更有弹性。

例如,我们回到SiteLayout.cshtml文件,并在其中定义两个节,这样视图模板可以有选择性的填充这两个节。我们将节的名称命名为“menu”和“footer”—然后在RenderSection()辅助函数传入optional=true这个参数来表明它们是可选填充节(我们可以用C#最新的optional参数语法来做这件事情,我在前面的博客里也提到了这个用法)。

image

因为两个节被标记成了“可选”,不需要在Home.cshtml文件中定义它们。即使没有它们,站点依然可以正常工作。

让我们回到Home.cshtml并自定义Menu和Footer节。下面的截图包含了Home.cshtml里所有的内容—再没有其它内容了。注:我已经把LayoutPage设置为站点范围的默认模板了—所以它没有显示在里面。

image

我们覆写的”menu”和“footer”节定义在文件里的以相应的名字命名的@section { }块里面。我们刻意不要求你在节里包含“main/body”内容,相反将它们内联在页面里(除了节省键盘敲击的次数以外,还便于你在版面设计页面中添加新的节以后,不需要再回去修改所有已有页面的语法)。

当再次将Home.cshtml以视图模板的形式显示的时候,它现在会合并版面设计页和子页面里的内容,并将两个自定义节覆写的内容整合进来,最终发送到客户端的内容如下:

image

封装和重用HTML辅助函数

我们刚刚讲过如何使用版面设计页给站点提供统一的观感。现在让我们看看如何通过创建可复用的“HTML辅助函数”来把生成HTML的功能封装成一个函数库,这样可以在整个站点复用—甚至在多个站点复用。

基于代码的HTML辅助函数

ASP.NET MVC有一个“HTML辅助函数”的概念—封装了生成HTML的逻辑并可以用在代码块里的函数。它们当前还都是纯粹通过代码实现的,一般通过扩展函数(Extension Method)实现。现有的所有内置在ASP.NET MVC里的HTML扩展函数都可以使用在“Razor”视图引擎里(不需要修改任何代码):

image

声明式的HTML辅助函数

使用纯代码的类来生成HTML可以工作—但不是很理想。

我们来看Razor的另外一个特性,使用简单的更具描述性的方法创建可复用的HTML辅助函数。我们计划让你可以使用类似下面的 @helper { }声明式语法创建可复用的辅助函数:

image

你将可以把包含有这种辅助函数的.cshtml文件放到一个Views\Helpers文件夹,然后就可以在站点上使用它们了(再没有其它的步骤了):

image

请注意上例中我们可以为ProductListing()函数定义参数。这样你就可以为函数传入任意的参数了(而且还能完全利用可选参数,nullable类型,范型等现有编程语言的特性),另外还有Visual Studio强大的调试支持。

注:@helper语法在Razor的第一个beta版里还没有—但我们希望能在下一个发布里把它包含进来。基于代码的辅助函数在第一个Beta版本里就可以使用。

传入内联模板作为参数

Razor中另一个很有用(或者可以说是相当了得)的功能就是允许向辅助函数传入“内联模板”参数。这些“内联模板”可以同时包含HTML和代码,而且可以被辅助函数即行调用。

下例中的“Grid”HTML辅助函数就是通过这种技术在客户端呈现一个DataGrid:

image

上例中Grid.Render()函数调用使用的是C#语法。我们使用了新的语法—C#命名参数把强类型的参数传给Grid.Render函数。这同时也意味着我们可以使用全部智能提示,还有编译时的语法检查功能。

在定义列的时候传给“format”参数的就是一个“内联模板”—它同时包含了自定义的html和代码,它们是用来自定义数据的显示方式的。更厉害的是,Grid辅助函数可以把我们的 “内联模板”当作一个委托来调用,想几时调用就几时调用,想调用多少次就调用多少次。在上面的场景里,每呈现grid的一行,就会调用它一次—并通过传入“item”变量,以便我们的模板可以显示恰当的内容。

这个功能允许你开发功能更强大的HTML辅助函数。今后你既可以使用代码方式(跟现在创建扩展函数的方式一样),也可以使用声明式的@helper { }方式来编写HTML辅助函数。

对Visual Studio的支持

前面说过,Razor的一个目标就是尽量减少键盘敲击次数,而且使用普通的文本编辑器就可以编写(记事本就很不错了)。我们通过保证语法清晰简单干练来实现这个目标。

Visual Studio也支持Razor, 使你在里面编写Razor代码时感觉更丰富。对于基于Razor的源文件,我们提供了完整的HTML、JavaScript和C#/VB代码智能提示功能:

image

请注意,上面我们甚至为嵌入在foreach循环体里面<li>元素的Product对象的“@p.”启用了智能提示。另外还要注意的地方是,在“解决方案资源管理器”的“\View”文件夹里,同时存放了.aspx和.cshtml视图模板。你可以在单个程序中使用多个视图引擎—便于你选择最适合你的引擎。

总结

我们认为“Razor”是一个非常好的新的视图引擎,它提供了流畅的专注于代码的模版方案。它的编码工作流快速、富有表现力并有趣。语法简练并节省按键次数,同时还提升了代码的可读性。它会作为内置的视图引擎并随下一个版本的ASP.NET MVC发布。你也可以把单独的.cshtml/.vbhtml放到程序里,并把它们当作独立的页面执行—这样你就也可以在ASP.NETWeb窗体程序中使用它了。

 

转至:http://blog.joycode.com/scottgu/archive/2010/07/20/116030.joy

======================================

collinye个人看法:razor给程序带来了方便,更增强代码的美感,终于可以摆脱“<%%>”,多令人高兴的事。明天准备在项目中做一下尝试。

posted @ 2010-08-04 22:56 collinye 阅读(188) 评论(1) 编辑

1. 使用Google地图API创建一个ASP.NET便利店定位程序:

ASP.NET Application Using Google Maps API

posted @ 2010-08-04 22:51 collinye 阅读(23) 评论(0) 编辑
  2010年7月29日

OPENID 自由行

clip_image001

 

简介

OpenID 是由LiveJournal和SixApart开发的一套身份验证系统。

OpenID 是一个以用户为中心的数字身份识别框架,它具有开放、分散、自由等特性。

OpenID 的创建基于这样一个概念:我们可以通过 URI (又叫 URL 或网站地址)来认证一个网站的唯一身份,同理,我们也可以通过这种方式来作为用户的身份认证。它不基于某一应用网站的注册程序,而且不限制于单一网站的登录使用。OpenID帐号可以在任何OpenID应用网站使用,从而避免了多次 注册、填写身份资料的繁琐过程。简单言之,OpenID就是一套以用户为中心的分散式身份验证系统,用户只需要注册获取OpenID之后,就可以凭借此 OpenID帐号在多个网站之间自由登录使用,而不需要每上一个网站都需要注册帐号。

OpenID AND Passport

网络通行证进化历程:

最原始的注册方式,自选字母或是数字等组合作为ID;

到了传说中的web2.0时代,用邮箱作为ID来注册,但是隐患是“不请自来”的邮件;

现在,用OpenID登录,即,不用担心垃圾邮件,省去填定个人资料的过程,节省了注册时间。

目前互联网上的主流帐号管理方式有两种:

单一帐号系统。只提供单一服务的网站采用的用户帐号管理模式。用户注册后使用此帐号可以在其网上上实现所有功能操作。

通行证。例如google、163、微软等提供多套服务的网站采用的帐号管理程序。用户在注册一次之后,使用该帐号可以在这些网站所属群里面自由使用。

与目前流行的网站帐号系统(Passport)相比,OpenID具有开放性以及分散式的特点。它比通行证更扩大化。它可以在任意OpenID应用网站中自由穿梭。

OpenID技术原理简述

假设你已经拥有一个在A网站注册获得的OpenID帐号,B网站支持 OpenID帐号登录使用,而且你从未登录过。此时你在B网站的相应登录界面输入你的OpenID帐号进行登录的时候,浏览器会自动转向A网站的某个页面进行身份验证。这时你只要输入你在A网站注册时候提供的密码登录A网站,对B网站进行验证管理(永久允许、只允许一次或者不允许)后,页面又会自动转到B 网站。如果你选择了允许,那就会登录进入B网站。(选择不允许就。。。)这个时候你就可以以你的OpenID帐户身份实现B网站的所有功能。

这里描述的是简单的B-A-B的过程,实际上会是多个OpenID应用网站与你的OpenID帐号的关系。

openid工作原理

其中A过程中实现了你的身份验证以及相应个人资料的选择。也就是说你使用A网站提供的一个OpenID帐号实现了B、C、D、E、F网站的登录操作。

角色

§ User:网站访问者操作的浏览器

§ RP:Relying Party ;服务提供者,就是用户要访问的网站。

§ OP:OpenID Provider ;OpenID提供者,就是提供OpenID注册的服务商。

如何获取和使用OPENID

1、 首先用户选择一个OpenID 服务提供者,来注册 OpenID 帐号(跟传统的网站注册无异),注册后用户得到一个 OpenID网址(OpenID URL),如http:/collinye.openid.com ,可以简单的理解为用户名。

2、 访问支持 OpenID 的网站,在登录时,输入你的 OpenID网址,通常此类登录页面的输入框会有如上图所示 OpenID 标志,然后点登录。

3、之后,会跳转你的OpenID 服务提供者的网站,并要求你输入注册时填写的密码,验证密码通过后会询问你是否允许该网站使用你的 OpenID 进行登录,经过允许后会跳转回原网站,并显示登录成功,之后你就可以以注册者的身份访问该网站。

认证流程

1、终端用户请求登录RP网站,用户选择了以OpenID方式来登录

2、RP将OpenID的登录界面返回给终端用户

3、终端用户以OpenID登录RP网站

4、RP网站对用户的OpenID进行标准化,此过程非常复杂。由于OpenID可能是URI,也可能是XRI,所以标准化方式各不相同。

5、RP发现OP,如果OpenID是XRI,就采用XRI解析,如果是URL,则用Yadis协议解析,若Yadis解析失败,则用Http发现。

clip_image003

6、RP跟OP建立一个关联。两者之间可以建立一个安全通道,用于传输信息并降低交互次数。

7、OP处理RP的关联请求

8、RP请求OP对用户身份进行登录检查

9、OP对用户登录检查,如果用户还没有登录,请求用户进行登录认证

10、用户登录OP、登录完检测RP请求哪些信息,如果没有需有用补填。

clip_image004

11、OP将登录结果返回给RP

12、RP对OP的结果进行分析

13、RP分析后,如用户合法,则返回用户登录成功,可以使用RP服务

clip_image006

Google OpenID解决方案:Federated Login基于OpenID标准

clip_image008

OPENID优缺点

优点

对用户

1. 简化注册登录流程:一定程度上避免了重复注册、填写身份资料的繁琐过程,不需要注册邮件确认,登录更快捷。

2. 一处注册,处处通行:免去记忆大量账号的麻烦,一个OpenID就在任何支持OpenID的网站自由登录。

clip_image010

3. 减少密码泄露风险:频繁登录各种网站,容易被垃圾网站暗地里收集密码和资料,或者冒充用户身份发送垃圾信息。

4. 用户拥有账号信息控制权:根据对网站的信任程度,用户可以清楚的控制哪些profile信息可以被共享,例如姓名、地址、电话号码等。

对网站(RP)

1. 共享用户资源:给所有支持 OpenID 的网站带来了价值。

2.已经有相当数量的高端注册用户可以直接使用,不必从零开始;

3.可以不负担自己建立会员系统或登录功能所需要的开发成本、机器、带宽、安全费用;

4.用户数据是安全的,用户数据不统一存储,用户可以任意选择、更换存储的server。没有组织,没有任何一个地方可以做root,没有任何一个机构或者个人能够从这里面获利。

缺点

1. 任何人都可以建立一个网站提供OpenID验证服务,而网站性能参差不齐,导致OpenID的验证过程不是很稳定。

2. 如果提供OpenID验证服务的网站突然关闭的话,可能会导致大量用户无法使用多个网站的服务。

3. 目前几乎所有支持OpenID的网站都很谨慎地将其做为一种可供选择的辅助登录方法,这会在很大程度上阻碍OpenID的发展。

4. 目前支持OpenID的网站还不多,其独特的使用方法并不被多数用户所熟悉。

拥有OPENID的你

拥有了OpenID你就可以使用它到支持OpenID的各个系统去直接登录使用了,例如我注册的OpenID:https://collinye.myopenid.com/,就可以不需要输入其他帐号密码,直接使用它作为帐号就可以登录使用了。当然还有更好的方法,就是在你的网站或Blog网页上放置如下代码

<link rel=“openid.server” ref="http://www.openid.cn/openid.server”>

<link rel=“openid.delegate” href="https://collinye.myopenid.com/">

使用OPENID的大腕

Facebook 作为RP支持OpenID

2009年5月,facebook宣布正式启用OpenID登录系统,允许用户使用Gmail或其它支持OpenID的网站帐号登录 Facebook。可以用Gmail帐号登录Facebook,也就是说,当你在Gmail里浏览邮件时,点击了一个Facebook的链接,你不需要再 输入密码,就能到达你自己的Facebook页面里。

Yahoo

OpenID技术让你可以用Yahoo!账号登录许多网站。一旦启用您的Yahoo! OpenID的访问帐户,您可以简单地告诉任何支持OpenID的网站,你是Yahoo!用户。

clip_image012

Google

Google期望用户用Gmail的帐号登录其他网站,比如Facebook,但是,它不允许用户用其它Facebook的帐号来登录Gmail。(半开放)

国内类OpenID

国内支持OpenID的Relying Part:Yupoo又拍乐铺,35.com/35.cn

国内OpenID Provider:OpenID.cn,豌豆,35.com/35.cn

posted @ 2010-07-29 23:49 collinye 阅读(144) 评论(0) 编辑
  2010年3月7日
摘要: 1.MVC概念--Model:用于存储数据的组件--View:根据Model数据进行内容展示的组件--Controller:接受并处理用户指令(操作Model),选择一个View并输出内容。Controller对View进行引用,但是View不知道Controller的存在。Controller和View都是单向引用ModelMVC变种:Observer模式,MVP模式。2.mvc路由机制MVC中...阅读全文
posted @ 2010-03-07 14:56 collinye 阅读(397) 评论(2) 编辑
  2010年3月3日

id和class到底要用哪一个?

  首先要明白id和class的各自的优缺点。这样才能根据他们的各自的特点进行使用。
id的优点(class的缺点):id写在css用"#"选择器,class写在css中用"."选择器。"#"选择器的优先级高于"."选择器大约10倍,所以当你需要提升优先级的时候,id标签,或者id容器内的标签将是很容易和有效的。而class标签,或者class容器内的标签将可能导致优先级的提升失败。

id的缺点(class的优点):id应该是唯一的,所以它的可复用性是很差的,而class是可以复用的。所以如果一块东西是多个页面,甚至一个页面都会使用多次的,那么一定要使用class来作为样式选择器。id是唯一的,当一个控件的id的产生是不可控的,那么这个id选择器将失去意义,但是任何一个控件即使是动态产生的,他的cssClass仍然是可定制的,所以当你的这个标签需要用服务器端控件替代的时候,而服务器端控件的id是不确定的,那么请使用class选择器,这样只要将服务器端控件的cssClass设为你class选择器的名称即可。(当然,这个还需要大量的经验的积累,项目做的多了就会逐步的改进) 

 

padding和margin到底要用哪一个? 

padding和margin可以让一块区域的外观显示完全一样。所以可能让很多人认为padding和margin是可以互换的。其实它们的差别很大,而且选择哪个需要认真和慎重地考虑。我认为对容器使用padding还是对容器内的标签使用margin的原则:当隐藏这个容器或者容器内的标签时(现实项目中其实经常需要将某个部件隐藏、显示),对整体布局影响最小为益。

对于padding再说一句:ie6,ie7(FF)对带有padding样式的标签的宽度的解析是不一样的。ie6的标签宽度不包含padding-left和padding-right的值,而ie7和ff则是包含的。例如一个div的width设置100px,padding设为10px,而在ie6中它要占据的宽度是120px(包含10个padding-left和10个padding-right),而在ie7和ff中则占据100px的宽度。因为ie7和ff会认为100已经包含了20px的padding。 

 

min-height和height

如果你只需要兼容ie6那么你完全不需要注意min-height这个样式,因为ie6根本就不支持这个样式。但是当你的页面需要照顾到ie7和ff的时候,这个样式一定要注意。因为很多在ie6下设置了height=固定值的样式,当容器被里面的东西撑的大于这个高度的时候,ie7和ff是不会自适应高度的。从而导致布局的混乱。要想在ie6,ie7和ff中都可以自适应高度,正确的做法是设置min-height和用cssHack设置height。例如:
min-height:600px;
_height:600px;
这样,在容器里面的东西很少的时候,它显示固定高度600px,但当里面的东西很多的时候,它也会自适应的增长高度。

对于height的设置一定要特别注意,如果是布局用的容器的height则需要特别的注意,否则在ff中会导致无法浮起,从而使布局混乱。 

 

 

posted @ 2010-03-03 22:02 collinye 阅读(115) 评论(0) 编辑
  2009年10月27日
摘要: [代码]阅读全文
posted @ 2009-10-27 11:30 collinye 阅读(62) 评论(0) 编辑
  2009年9月15日
摘要: I issued the commands [代码]"At this point, the Full Text Search was available in the Management Console"From here in TSQL :- --1 Create the catalog (unless you already have)[代码]--2 Add a full text in...阅读全文
posted @ 2009-09-15 13:21 collinye 阅读(19) 评论(0) 编辑
  2009年6月25日
摘要: 一、站点结构n http://www.test.com/:test主站n space.test.com:space子站n edu.test.com:平台子站二、认证处理n 所有站点采用Forms认证,站点下和下面的虚拟上当web.config加以下配置<-- 这个结点是阻止匿名用户访问根据各个情况配置,也可指定各个位置具体配置 --> <authorization> <...阅读全文
posted @ 2009-06-25 20:20 collinye 阅读(146) 评论(1) 编辑
摘要: [代码]阅读全文
posted @ 2009-06-25 20:18 collinye 阅读(367) 评论(0) 编辑