Scott Guthrie 博客中文版

Scott Guthrie's Blog on ASP.NET and .NET (英文原版地址:http://weblogs.asp.net/scottgu)

   博客堂 :: 首页 :: 联系 :: RSS 2.0 ::
随笔 - 238, 评论 - 1129, 引用 - 436

导航

标签

每月存档

最新留言

广告

【第1页/共24页,238条】
首页
前页
1
...
2010年02月08日

【原文地址】ASP.NET MVC 2: Model Validation
【原文发表日期】 Friday, January 15, 2010 4:14 AM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

这是我针对即将发布的ASP.NET MVC 2所撰写的贴子系列的第二篇,这个博客贴子将讨论 ASP.NET MVC 2中一些验证方面的改进。

ASP.NET MVC 2 验证

对用户输入的验证以及强制业务规则/逻辑是大多数web应用的核心需求。ASP.NET MVC 2包含了一堆新的特性,显著地简化了对用户输入的验证以及在模型/视图模型中对验证逻辑的强行实施。这些特性是这样设计的,验证逻辑总是在服务器上执行的,也可以选择在客户端通过JavaScript来执行。ASP.NET MVC 2中的验证设施和特性这般设计,以便:

1) 开发人员可以轻易地利用内置于.NET框架中的DataAnnotation验证支持。DataAnnotation提供了一个非常简便的方式,使用最少的代码在对象和属性上用声明的方式添加验证规则。

2) 开发人员可以集成他们自己的验证引擎,或者利用现有的验证框架,象Castle验证器或EntLib验证库。ASP.NET MVC 2的验证特性是设计来在利用新的 ASP.NET MVC 2的验证设施(包括客户端验证,模型绑定验证等等)的同时,简化任何类型的验证架构的插入的。

这意味着,在常见的应用场景中启用验证是极其容易的,同时对更高级的场景则还能保持极好的灵活性。

使用ASP.NET MVC 2 和 DataAnnotation来启用验证

让我们在ASP.NET MVC 2中来全程示范一个简单的CRUD场景,利用新的内置DataAnnotation验证支持。具体来说,让我们来实现一个“Create”表单来允许用户输入朋友的数据:

image

我们想要确保在保存到数据库之前,输入的信息是合法的,如果不合法,就显示合适的错误消息:

image

我们想要使得这个验证同时在服务器端和客户端(通过 JavaScript)发生。我们还想要确保我们的代码遵守DRY原则(Don't Repeat Yourself,不重复自己),意味着我们应该只在一处实施验证规则,然后使得我们的控制器,action方法和视图来兑现这个承诺。

在下面,我将使用VS 2010,用ASP.NET MVC 2来实现上面的场景。你也可以使用VS 2008及ASP.NET MVC 2来实现完全一样的场景。

第一步: 实现FriendsController (一开始没有验证)

我们首先在一个新的ASP.NET MVC 2项目中加一个简单的“Person”类,象下面这样:

image

它有四个属性(是用C#的自动属性支持实现的, 在VS 2010中VB也支持自动属性了,哎!)。

然后在项目中加一个 “FriendsController” 控制器类,呈示2个 “Create” action方法。第一个action方法是在对/Friends/Create URL的HTTP-GET请求进来时调用的,它会显示一个空白的表单,用来输入个人数据。第二个action方法是在对/Friends/Create URL的HTTP-POST请求进来时调用的。它会将提交的表单输入映射到一个Person对象,核实没有绑定错误发生,如果是合法的,最终会将数据保存到数据库中去(在本教程的后面我们会实现相关的数据库工作)。如果提交的表单输入是不合法的,该action方法会重新显示带有错误的表单:

image

在实现了控制器之后,可以在Visual Studio中在其中一个action方法中右击,选择 “添加视图”命令, 这会调出 “添加视图” 对话框。选择自动生成传入对象为Person的“Create”视图:

image

然后Visual Studio会在我们项目的\Views\Friends\目录中,生成一个含有框架代码(scaffolded)的Create.aspx视图文件。注意下面,它利用了ASP.NET MVC 2中新的强类型HTML辅助方法(促成了更好的intellisense和编译时检查支持):

image

现在,当我们运行该应用,访问 /Friends/Create URL时,我们将得到一张可以输入数据的空白表单:

image

但,因为我们还没有在应用中实现任何验证,谁也无法阻止我们在表单中键入假的输入,将其提交到服务器去。

第二步: 使用DataAnnotation来启用验证

现在,让我们来更新应用,执行一些基本的输入验证规则。我们将在我们的Person模型对象上实现这些规则,而不是在控制器或视图中实现。在Person对象上实现这些规则的好处是,这将确保这些验证在应用中任何使用Person对象的场景中都会被执行(例如,如果后来添加了编辑场景的话)。这将帮助确保我们将代码保持DRY,避免在多处重复这些规则。

ASP.NET MVC 2 允许开发人员轻松地在模型或视图模型类上添加声明式验证特性,然后ASP.NET MVC在应用中实施模型绑定操作时,这些验证规则就会被自动执行。为看其例子,让我们更新Person类,在其中加几个验证特性。这么做,在文件的顶部加一个对“System.ComponentModel.DataAnnotations”命名空间的 “using” 语句,然后在Person的属性上饰于[Required], [StringLength], [Range], 和 [RegularExpression] 验证特性(这几个特性都是在那个命名空间中实现的):

image

注: 在上面我们明式指定了错误信息字符串,你也可以在资源文件中定义它们,或者按进来的用户的语言/文化做本地化,你可以在这里了解如何本地化验证错误消息。

既然我们加了验证特性到Person类上,让我们来重新运行我们的应用,看在键入假的数值,将其提交回服务器时会发生什么:

image

注意上面我们的应用现在有一个蛮好的出错体验了。带不合法输入的文本元素以红色高亮显示,我们指定的验证错误消息也显示给了用户。表单还保留用户原先输入的数据,这样他们不用重新填写什么。但,你也许会问,怎么会是这样?

要理解这个行为,让我们看一下处理我们表单的POST场景的Create action方法:

image

在我们的HTML表单被提交回服务器时,上面的方法就会被调用。因为该action方法接受一个“Person” 对象为参数,ASP.NET MVC会创建一个Person对象,自动地将进来的表单输入数值映射到该对象上。作为该过程的一部分,ASP.NET MVC还会检查该Person对象上的DataAnnotation验证特性是否合法。如果一切都合法,那么我们代码中的ModelState.IsValid检查就会返回真值,在这种情形下,我们(最终)将把该Person对象保存到数据库中,然后重新定向回到主页上去。

但如果Person对象上有任何验证错误的话,我们的action方法就会以该不合法Person对象的数据重新显示表单,这是通过上面代码片段中最后一行代码实现的。

然后,错误消息就会显示在我们的视图中,因为我们的Create表单在每一个<%= Html.TextBoxFor() %>辅助方法的调用旁边都有一个<%= Html.ValidationMessageFor() %>辅助方法调用。Html.ValidationMessageFor() 辅助方法会针对传入视图的任何不合法的模型属性输出合适的错误消息:

image

这个模式/方式有一个好处,就是非常容易配置,它还允许我们轻松地添加或改变我们Person类上的验证规则,而不必改变控制器或视图中的任何代码。这个在一个地方指定验证规则,然后在所有的地方都会被承诺和遵守的能力,允许我们以最少的努力快速地发展我们的应用和规则,并且将代码保持在非常DRY的程度。

第三步: 启用客户端验证

目前我们的应用只能做服务器端的验证,这意味着我们的终端用户需要将表单提交到服务器才能看到任何验证错误消息。

ASP.NET MVC 2的验证架构中一样非常酷的东西是,它同时支持服务器端 客户端验证。为启用这个功能,我们要做的就是在视图中添加2个 JavaScript引用,编写一行代码:

image

在我们添加了这三行后,ASP.NET MVC 2 就会使用我们加到Person类上的验证元数据,为我们连接好客户端JavaScript验证逻辑。这意味着,当用户使用tab键跳出一个不合法的输入元素时,就会得到瞬时的验证错误。

要在我们的朋友应用中看客户端JavaScript支持的实战例子的话,让我们重新运行应用,在前三个文本框中填入合法的数值,然后尝试点击“Create(创建)”。注意,我们不必访问服务器就会得到遗漏值的瞬时错误消息:

image

如果我们输入一些不是合法的email的字符话,错误消息就会瞬时从“Email Required (Email是个必需值)” 变为 “Not a valid email (email不合法)”(这是我们将规则加到Person类上时指定的错误消息):

image

在输入一个合法的email时,错误消息就是瞬时消失,文本框背景色也会恢复到正常的状态:

image

好事是,我们不必编写自己的任何定制JavaScript就能启用上面的验证逻辑。我们的验证代码还是那么DRY,我们可以在一个地方指定规则,然后在整个应用中得到执行,同时在客户端和服务器端。

注意,为安全的原因,服务器端验证规则总是执行的,即时你启用了客户端支持。这避免黑客尝试绕过客户端规则,哄骗攻击(spoof)你的服务器。

ASP.NET MVC 2中的客户端JavaScript验证支持可与你在ASP.NET MVC应用中使用的任何验证框架/引擎协作,它并不要求你使用 DataAnnotation 验证方式,所有的基础设施是独立于 DataAnnotation的,可以与Castle验证器, EntLib验证应用块,或你选择使用的任何定制验证方案协作使用。

如果你不想使用我们的客户端JavaScript文件,你也可以将其替换成jQuery验证插件,而使用那个库。 ASP.NET MVC Futures下载还包括针对ASP.NET MVC 2服务器端验证框架启用jQuery验证的支持。

第四步: 创建自定义的[Email]验证特性

.NET框架中的System.ComponentModel.DataAnnotations命名空间包括了众多可为你所用的内置验证特性。我们在上面的例子中使用了其中的四个:[Required], [StringLength], [Range], 和 [RegularExpression]。

你也可以定义自己的定制验证特性,然后应用它们。你可以通过继承自System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute基类,定义完全定制的特性。或者,你也可以选择继承自任何现有的验证特性,如果你只想要扩展它们的基本功能的话。

例如,为帮助清理我们Person类中的代码,我们也许想要创建一个新的[Email]验证特性,将检查合法email的正则表达式封装起来。要这么做的话,我们只要象这样继承自RegularExpressionAttribute基类,然后用合适的email正则表达式调用RegularExpressionAttribute基类的构造器:

image

然后将Person类更新成使用我们新的[Email]验证属性,换掉我们先前使用的正则表达式,这使得我们的代码更干净,封装也更好:

image

在创建定制的验证特性时,你还可以指定在服务器端以及在客户端通过JavaScript执行的验证逻辑。

除了创建可施用于对象上个别属性的验证特性外,你还可以将验证特性施用于类的层次,这允许你对一个对象中的多个属性实施验证逻辑。要看实战例子的话,你可以参阅包含在默认ASP.NET MVC 2应用项目模板中AccountModels.cs/vb文件中的“PropertiesMustMatchAttribute” 定制特性(在VS 2010中做 文件->新ASP.NET MVC 2 Web项目,然后查询该类)。

第五步: 持久化到数据库中

现在让我们来实现将朋友数据保存到数据库所需的逻辑。

image 

至此,我们只用了平白的(plain-old)C#类(有时称为“POCO” 类, 即 “plain old CLR (or C#) object”)。我们可以使用的一个方案是,编写一些单独的持久代码,将这我们已经编写好的现有类映射到数据库去。目前象NHibernate这样的对象关系映射(Object relational mapping - ORM)方案非常地好支持这样的POCO/PI风格的映射。随.NET 4发布的ADO.NET实体框架(Entity Framework - EF)也支持POCO / PI映射,而且就象NHibernate,EF也能启用以“只用代码(code only)”的方式(没有映射文件,也不需要设计器)定义持久性映射的能力。

如果我们的Person对象以这种方式映射到数据库的话,我们不用对Person类做任何改动,也不用改动任何验证规则,它还会继续完好地工作。

但假如我们要使用图形工具来做ORM映射的话,怎么办?

今天使用Visual Studio的许多开发人员并不编写他们自己的ORM映射/持久逻辑,而是使用Visual Studio中内置的设计器来帮助管理这样的映射逻辑。

使用DataAnnotation(或者任何其他形式的基于特性的验证)时一个经常问起的问题是,“如果你手头的模型对象是由GUI设计器创建/维护的话,你该如何施用这些特性?”。例如,假如与类似我们至此为止一直在使用的POCO风格的Person类不同,我们而是在Visual Studio中通过象LINQ to SQL 或 ADO.NET EF设计器这样的GUI映射工具定义/维护我们的Person类的话,该怎么办呢:

image

上面是一张屏幕截图,展示了在VS 2010中使用ADO.NET EF设计器定义的一个Person类。上方的窗口定义了Person类,下方的窗口展示了该类的属性是如何映射到数据库中的“People”表的映射编辑器。当你在设计器上点击保存时,它会自动为你在项目中生成一个Person类。这很棒,但每次你做了改动,点击保存时,它就会重新生成 Person 类,这会导致你在对象上面声明的任何验证特性的丢失。

将额外的基于特性的元数据(象验证特性)施加到由VS设计器自动生成/维护的类的一个方法是,采用一个我们称之为“伙伴类(buddy classes)”的技术。基本上来说,你创建另外一个类,包含你的验证特性和元数据,然后通过将 “MetadataType”特性施加到一个与工具生成的类一起编译的partial类上,将其与由设计器生成的类连接起来。例如,如果我们想要将我们前面用到的验证规则施加到由LINQ to SQL 或 ADO.NET EF设计器维护的Person类上,我们可以更新我们的验证代码,使其存在于一个单独的“Person_Validation”类上,使用象下面这样的代码将其连接到由VS创建的“Person”类上:

image

上面的做法没有纯粹的POCO方法那么优雅,但其好处是,可以用于Visual Studio中任何工具或设计器生成的代码。

最后一步 – 将Friend保存到数据库中

最后一步,不管是否采用了POCO或工具生成的Person类,是将合法的朋友数据保存到数据库中去。

这只要求我们用三行代码将FriendsControlle类中的 “Todo”占位语句替换掉,这三行代码将新朋友保存到数据库。下面是整个FriendsController类的完整代码(使用了ADO.NET EF做数据库持久化):

image

现在,当我们访问 /Friends/Create URL时,我们可以轻松地添加新人到我们的朋友数据库中去:

image

对所有数据的验证都是同时在客户端和服务器端执行的。我们可以轻易地在一个地方添加/修改/删除验证规则,而由整个应用中的所有的控制器和视图来执行这些规则。

结语

ASP.NET MVC 2极大地简化了web应用的验证集成。它倡议一种基于模型的验证方式,允许你将你的应用保持DRY,帮助确保验证规则在整个应用中保持一致。ASP.NET MVC 2中内置的DataAnnotation支持,原本就使得对常见的验证场景的支持非常容易。而且,ASP.NET MVC 2验证设施中的扩展性支持允许你支持更大范围的更高级的验证场景,可以插入任何现有的或者定制的验证框架/引擎。

希望本文对你有所帮助,

Scott

posted on 2010-02-08 01:03:56 by scottgu  评论(0) 阅读(1174)

 
2010年01月17日

【原文地址】ASP.NET MVC 2: Strongly Typed Html Helpers
【原文发表日期】 Sunday, January 10, 2010 8:57 PM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

这是我针对即将发布的ASP.NET MVC 2所撰写的贴子系列的第一篇,这个博客贴子将讨论 ASP.NET MVC 2中新加的强类型HTML辅助方法。

现有的HTML辅助方法

ASP.NET MVC 1中发布了一套HTML辅助方法,可以用来在视图模板中帮助生成HTML界面。例如,要输出一个文本框,你可以在你的.aspx视图模板中使用Html.TextBox()辅助方法编写下列代码:

image

上面辅助方法的第一个参数提供了文本框的名称及id,第二个参数指定了它该有的值,然后上面的辅助方法会显示象下面这样的HTML到浏览器:

image

新的强类型HTML辅助方法

大家对ASP.NET MVC 2要求的一个常用特性是,要我们支持强类型的HTML辅助方法,这样的辅助方法使用 lambda 表达式来引用传到视图模板中的模型或视图模型。这可以促成更好的编译时视图检查(可以在编译时发现缺陷,而不是在运行时),还可以促成视图模板中更好的代码intellisense支持。

新的强类型HTML辅助方法现在已经内置于ASP.NET MVC 2中了,这些方法使用"Html.HelperNameFor()”的命名规范。例如,Html.TextBoxFor(), Html.CheckBoxFor(), Html.TextAreaFor()等等。它们支持使用lambda表达式来指定元素的名称和id,以及要显示的值。

例如,除了上面的Html.TextBox()辅助方法外,使用ASP.NET MVC 2,我们现在还可以使用新的Html.TextBoxFor()辅助方法:

image

注意上面,我们不再需要指定 “ProductName” 字符串参数,lambda表达式是相当灵活的,除了值以外,我们还可以获取我们模型对象中的属性/字段的名称。

因为这些HTML辅助方法是强类型的,编写lambda表达式时我们还可以在Visual Studio中得到完整的intellisense支持:

image

显示的HTML跟前面的后期绑定的HTML辅助方法版本的输出是一样的:

image

内置于ASP.NET MVC 2中的强类型HTML辅助方法列表

ASP.NET MVC 2对下列强类型的HTML辅助方法提供内置支持:

HTML元素辅助方法:

  • Html.TextBoxFor()
  • Html.TextAreaFor()
  • Html.DropDownListFor()
  • Html.CheckboxFor()
  • Html.RadioButtonFor()
  • Html.ListBoxFor()
  • Html.PasswordFor()
  • Html.HiddenFor()
  • Html.LabelFor()

其他辅助方法:

  • Html.EditorFor()
  • Html.DisplayFor()
  • Html.DisplayTextFor()
  • Html.ValidationMessageFor()

我会在本系列的后期贴子中讨论ASP.NET MVC 2中改进了的“自动脚手架(auto-scaffold)"功能时,对新的Html.EditorFor() 和 Html.DisplayFor()辅助方法做进一步介绍。在本系列的下一个博客贴子中讨论ASP.NET MVC 2中改进了的验证支持时,我们还将使用Html.ValidationMessageFor()辅助方法。

Scaffolding中的强类型HTML辅助方法

VS 2008 和 VS 2010两者在用“添加视图”命令“生成(scaffolding)”新的强类型视图模板时,现在都会默认使用新的强类型HTML辅助方法。

例如,假设我们有一个象下面这样的简单 “ProductsController” 类,有一个“Edit” action方法,会为“Product”模型类显示一个编辑表单:

image

我们可以使用Visual Studio在Edit action方法中右击,选择“添加视图”上下文菜单命令来创建一个视图模板,我们将选择创建一个“Edit”模板,该模板是使用Product对象来生成的(scaffolded):

image

在ASP.NET MVC 2中,默认生成的视图模板现在使用了新的强类型HTML辅助方法来引用Product模型对象:

image

结语

包含在ASP.NET MVC 2中的强类型HTML辅助方法提供了一个很好的方式来在视图模板中得到更好的类型安全。这促成了对你的视图的更好的编译时检查(允许你在编译时,而不是运行时发现错误),还在Visual Studio中编辑视图模板时支持更丰富的intellisense。

希望本文对你有所帮助,

Scott

posted on 2010-01-17 13:30:37 by scottgu  评论(0) 阅读(6037)

 

【原文地址】ASP.NET MVC 2
【原文发表日期】 Sunday, January 10, 2010 8:54 PM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

过去的6个月里,ASP.NET开发团队一直不断地发布了ASP.NET MVC 2的预览版,然后是beta版,现在则是RC(最终版的候选版)。

鉴于最终版的发布也不太远了,我想该是开始一个含多个部分的ASP.NET MVC 2 新博客系列的时候了,该系列旨在讨论新的特性以及该如何充分利用它们。

ASP.NET MVC 2

去年三月份时,我们发布了ASP.NET MVC 1.0。自那以后,几乎有一百万开发人员下载和使用了1.0的最终版,它的人气(popularity)逐月递增。

ASP.NET MVC 2是ASP.NET MVC的下一个重大更新版本,它与ASP.NET MVC 1是兼容的,即,你拥有的有关ASP.NET MVC所有的知识,技能,代码,和扩展,之后可以继续发挥作用。就象第一个版本一样,我们依然会在与OSI相容的开源许可下发布ASP.NET MVC 2的源代码

ASP.NET MVC 2 特性

ASP.NET MVC 2 添加了一堆新的功能和特性。我将在这个博客系列里对它们进行深入讨论,包括下面这些:

  • 新的强类型HTML辅助方法 (发表于2010年1月10日)
  • 跨越服务器和客户端的增强模型验证支持(发表于2010年1月15日)
  • Auto-Scaffold UI Helpers with Template Customization (不久就会发表)
  • Support for partitioning large applications into “Areas” (不久就会发表)
  • Asynchronous Controllers support (不久就会发表)
  • Support for rendering sub-sections of a page/site using Html.RenderAction (不久就会发表)
  • Lots of new helper functions, utilities, and API enhancements (不久就会发表)
  • Improved Visual Studio tooling support (不久就会发表)

如何下载ASP.NET MVC 2

ASP.NET MVC 2是设计来可在VS 2008 / .NET 3.5,以及VS 2010 / .NET 4下工作的。同时支持2个版本意味着你今天就可以开始使用,而不必等着升级到VS2010 / .NET 4才用。

点击这里下载针对 .NET 3.5 和 VS 2008的 ASP.NET MVC 2的RC版,可在同个机器上与ASP.NET MVC 1.0并列安装。

ASP.NET MVC 2是 VS 2010 / .NET 4的内置组件,这意味着,在你安装Visual Studio 2010的任意一个版本之后,你不用下载或安装别的就可以得到ASP.NET MVC 2。目前的公开VS 2010 Beta 2版包含了ASP.NET MVC 2 的第二个预览版。下个月将发布的VS 2010 RC版将会有一个比较新的ASP.NET MVC 2 RC版本。

ASP.NET Web Forms + ASP.NET MVC

我们总是很谨慎地表明, ASP.NET MVC是ASP.NET中的一个选项。 ASP.NET Web Forms将继续会是使用ASP.NET建造应用时最为广泛使用的方式,而且新的 ASP.NET 4 版本包含了针对 ASP.NET Web Forms开发的显著改进(干净的客户端ID和基于CSS的控件标识,更好的ViewState管理,新的数据和图表控件,URL导向,SEO改进等等),你可以在我撰写中的VS 2010 和 .NET 4 博客系列中了解这些改进的详情。

在将来的版本中,我们还将进一步改进和增强ASP.NET Web Forms 和 ASP.NET MVC这2个编程模型,开发人员可以,也应该选择对他们来说感觉最舒服和最自然的模型。不久我们会在 www.asp.net 上发布新的录像和导引,帮助提供每个模型的额外导引,以及如何选择对你来说感觉最舒服的那个模型。

希望本文对你有所帮助,

Scott

posted on 2010-01-17 13:27:53 by scottgu  评论(0) 阅读(6135)

 
2010年01月06日

【原文地址】ASP.NET 4 SEO Improvements (VS 2010 and .NET 4.0 Series)
【原文发表日期】 Tuesday, January 05, 2010 1:08 AM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

这是我针对即将发布的VS 2010 和 .NET 4所撰写的 贴子系列的第十三篇。今天的博客讨论ASP.NET 4中围绕搜索引擎优化(SEO)所做的一些改进。

为什么要做SEO?

搜索引擎优化(SEO)对任何面向公众的网站来说都是非常重要的,现在网站很大比例的流量来自搜索引擎, 提高你的网站的搜索相关性将导致更多来自搜索引擎查询的用户流量(会直接或间接地增加你通过网站所赚取的收入)。

使用SEO工具包测量你网站的SEO

上个月,我在博客中写到了我们发布的免费SEO 工具包,你可以用它来分析你网站的SEO正确性,该工具还会对它发现的任何SEO问题提供详细的建议。

我高度推荐下载这个工具,并对你手头的任何公开网站使用这个工具进行分析。它极大地方便了发现网站的SEO问题所在,同时精确指出进一步优化的方式。

ASP.NET 4 中的SEO 改进

ASP.NET 4包括了一堆新的运行时特性,可以帮助你进一步优化你的网站。其中一些新特性包括:

  • 新的Page.MetaKeywords 和 Page.MetaDescription 属性
  • 针对ASP.NET Web Forms的新URL导向支持
  • 新的Response.RedirectPermanent()方法

下面是如何利用这些特性来进一步提高搜索引擎相关性的细节。

Page.MetaKeywords 和 Page.MetaDescription 属性

改进网页搜索相关性的一个简单建议是,确定你总是在你HTML中的<head>部分输出相关的“keywords(关键词)” and “description(描述)” <meta>标识。例如:

image

ASP.NET 4 Web Forms中一个很好的改进是在Page类中加了2个新属性:MetaKeywordsMetaDescription,它们使得在后台代码类中用编程的手法设置这些值更容易,也更干净。

ASP.NET 4的 <head> 服务器控件现在会看这些值,然后在输出网页的<head>部分时使用它们。这个行为在使用母版页的场景中尤其有用,<head> 是在.master文件中,与含有特定页面内容的.aspx文件是分开的。你现在可以在.aspx页面中设置新的MetaKeywords 和 MetaDescription属性,它们的值会自动地由母版页中的<head>控件来显示。

下面是简单的代码片段,示范如何在Page_Load()事件处理函数中用编程手法设置这些属性:

image

除了在后台代码中用编程手法设置Keywords 和 Description属性外,你现在还可以在.aspx网页顶部的@Page指令中用声明的方式设置它们。下面的代码片段示范该怎么做:

image

就象你能预期的那样,如果你用编程手法设置这些值的话,它们会替代在<head>部分或@Page指令中声明设置的任何值。

ASP.NET Web Forms中的URL导向

URL导向是我们最先在ASP.NET 3.5 SP1中引进的一个功能,已为ASP.NET MVC应用所用,来呈示干净的,SEO友好的“web 2.0” URL。URL导向让你配置一个应用来接受并不映射到物理文件的请求URL,你可以使用导向来定义对用户来说语义上更具含义的URL,这些URL有助于搜索引擎优化(SEO)。

例如,一个显示产品分类的传统网页的URL也许看上去会是这样的:

http://www.mysite.com/products.aspx?category=software

使用ASP.NET 4中的URL导向引擎,你现在可以配置应用来接受下面这样的URL来显示同样的信息:

http://www.mysite.com/products/software

在ASP.NET 4.0中,象上面那样的URL现在可以映射到ASP.NET MVC控制器类,也可映射到基于ASP.NET Web Forms的网页。你甚至可以有一个应用,同时含有 Web Forms 和 MVC控制器,使用单一一套导向规则在它们之间映射URL。

请阅读一下我以前的《在ASP.NET 4 Web Forms中实现URL导向》的贴子,进一步了解ASP.NET 4中新的URL导向特性是如何支持基于 Web Forms的网页的。

Response.RedirectPermanent() 方法

随着时间的迁移,在web应用间移动网页和其他内容是极其常见的,但会导致在搜索引擎中失效链接的积累。

在ASP.NET中,开发人员经常使用Response.Redirect()方法,用编程的手法,将对老的URL的请求转到新的URL上。但许多开发人员没有意识到的是,Response.Redirect()方法发的是个 HTTP 302 Found (临时转向) 回复,会在用户尝试访问老的URL时,导致多余的HTTP往返。搜索引擎一般不会跟随多个重新转向跳转,意味着使用一个临时转向会负面影响你的网页排名。你可以使用SEO工具包来识别你网站上什么地方有这个问题。

ASP.NET 4引进了一个新的Response.RedirectPermanent(string url)辅助方法,可以用来做一个HTTP 301 (永久性重定向)重新定向。这会导致能识别永久性重新定向的搜索引擎和其他用户代理保存和使用与内容相关联的新URL。这会使你的内容编入索引,你的搜索引擎页面排名得到提高。

下面是使用新的Response.RedirectPermanent()方法重新定向到特定URL的一个例子:

image

ASP.NET 4还引进了新的Response.RedirectToRoute(string routeName) Response.RedirectToRoutePermanent(string routeName)辅助方法,可以用来通过URL导向引擎做临时或永久性的重新定向。下面的代码片段示范了如何发出临时和永久性的重新定向到注册在URL导向系统中的具名路径的(该路径接受一个category参数)。

image

你可以同时针对基于ASP.NET Web Forms以及基于ASP.NET MVC 的URL使用上面的路径和方法。

结语

ASP.NET 4包含了成堆的特性改进来方便建造极致SEO的面向公众的网站。当与SEO工具包相结合时,你应该能够使用这些特性增加到你网站的用户流量, 但愿能直接或间接地增加你从中取得的收入。

希望本文对你有所帮助,

Scott

posted on 2010-01-06 09:46:10 by scottgu  评论(0) 阅读(10477)

 
2010年01月03日

【原文地址】ASP.NET 4, ASP.NET MVC, and Silverlight 4 Videos of my Talks in Europe
【原文发表日期】 Saturday, January 02, 2010 1:05 PM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

希望大家都过了一个很好的节日,欢迎来到 2010!

上个月,我在一个博客贴子中写到了我在欧洲所做的讲座,还贴出了相关的讲义和示范例程文件。两个星期前,Channel9网站贴出了我在瑞典做的讲座的高质视频,这样你现在也可以在线观看这些讲座的录像了。这些录像用了一个很好的格式,你既可以看到我在说话,同时还可以看到屏幕,在全屏模式下观看时,代码都是可读的。

下面是各个讲座的链接(以及相关的讲义和示范例程文件):

ASP.NET 4 和 VS 2010 Web 开发

这个90分钟的讲座对 ASP.NET 4 和 VS 2010 Web开发提供了一个很好的介绍。讲座以示范为主,对新版本中的许多新特性做了示范。

这个讲座的前2分钟是某人用瑞典语介绍我,但其他部分则是我在用英语演讲。

ASP.NET MVC

这个2小时的讲座对ASP.NET MVC做了一个很好的介绍,通过示范如何从头开始建造一个简单的应用,来解释ASP.NET MVC。在过程中,对ASP.NET MVC 2中的一些新特性做了重点讨论。

Silverlight 4

这个60分钟的讲座重述了我在PDC所做的主题演讲的内容,对新的Silverlight 4特性和功能做了示范。

希望本文对你有所帮助,

Scott

posted on 2010-01-03 10:13:42 by scottgu  评论(0) 阅读(6274)

 
2009年12月18日

【原文地址】Visual Studio 2010 and .NET 4 Update
【原文发表日期】 Thursday, December 17, 2009 4:21 PM

十月份,我们发布了Visual Studio 2010 和 .NET 4的公开 Beta 2 版。大家对VS 2010 和 .NET 4中新特性的反馈非常地好。我还撰写了一个博客系列讨论其中一些特性(还有更多的贴子在前头!),还有机会将它们呈现给更大范围的观众,听到大家对它们的兴奋之情,非常让人开心。

但同时,我们也收到了反馈说VS 2010 Beta 2的性能和虚拟内存的占用还没达到正式发布前的水平。

过去的2个月,我们着重做了性能优化,整个产品的性能和虚拟内存的占用都大为改进。测试了Beta2之后中间版本的一小部分的客户的早期反馈对这些改进非常正面。我们还有若干个大的性能方面的修补目前正在签入过程中(in the process of being checked in),将会提供进一步的改进。

公开的最终版候选版(Release Candidate)

为了确保这些修补确实解决了报告的性能问题,帮助在最大范围的场景和机器配置下确认其有效性,我们决定在正式发布前再发布一个VS 2010 和 .NET 4的公开预览版。具体来说,我们计划在二月份发布一个Release Candidate版本,每个人都能下载和测试。这将是个公开的版本,包括大范围的支持生产性部署的“go live”许可。

这个Release Candidate版本的目的是想就产品是否就绪得到大家全面的反馈,为了确保我们能够收到反馈并对这些反馈作出反应,我们还将把Visual Studio 2010 和 .NET 4正式发布的日期推后几个星期。

请继续发送给我们你对产品的反馈,以及你在目前的Beta 2版本中所遇到的问题的细节。你的反馈是非常宝贵的,会帮助确保我们发布合适的产品。请随时给我发电邮(scottgu@microsoft.com),如果你遇到某个你认为还没有报告过的问题的话。

希望本文对你有所帮助,

Scott

posted on 2009-12-18 11:46:03 by scottgu  评论(0) 阅读(7672)

 

【原文地址】Silverlight 4 demos from my PDC Keynote now available
【原文发表日期】 Wednesday, December 16, 2009 9:56 PM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

上个月,我在PDC大会上做了一个Silverlight 4的主题演讲。你可以在这里在线观看我的主题演讲(我的部分是在录像的53:30时分开始的)。

在演讲中,我展示了多个很有趣的示范,着重介绍了Silverlight 4中的一些新特性。今天,我们把这些样例(含代码)发布在网上,这样你可以下载,并在你自己的机器上本地运行它们。

你可以在这里下载主题演讲中的示范(源代码,每个例程都包含了VS项目文件)。

主题演讲中的示范

下面是供下载的每个示范的一些细节:

PhotoBooth应用

PhotoBooth应用示范了你可以用Silverlight 4中新的网络摄像头(WebCam)和麦克风(Microphone)支持来做的一些有趣的事情,它允许你在浏览器中记录视频和照相,然后可以对它们施加效果(例如下面的膨胀效果),要过把瘾的话,还可以将任何一张照片发到 Twitter上, :-)。

image

条形码扫描器(BarCode Scanner)

条形码扫描器应用也使用了Silverlight 4中新的WebCam支持。它允许你扫描书背后的ISBN条形码,然后使用 Amazon web服务在线查询该书的细节:

image

富记事本(Rich Notepad)

富记事本应用展示了Silverlight 4中一些新的文本编辑特性。它允许你在浏览器中编辑rich text(多信息文本),支持 Bidi文字(包括阿拉伯文和希伯来文),同时支持从左到右(left-to-right)和从右到左(right-to-left, RTL)的控件布局(RTL示范如下,注意卷动条是在屏幕的左边),支持编程手法拷贝/粘贴到系统剪贴板,自定义右击上下文菜单,打印,和将文件从桌面拖放到浏览器中以做编辑等:

image

HTML Hosting(宿主)

HTML Hosting应用展示了如何在浏览器之外的应用中使用新的Silverlight 4 webbrowser控件(注:你必须在浏览器以外运行,该应用才会工作)。它允许你以交互的方式使用该控件(意即你可以点击其中的HTML,象一个应用一样运行)。它还允许你将宿主的HTML当作画刷,将它们施加到其他Silverlight控件上。为好玩,你可以点击下面的 MSDN.com 页,你会rick-rolled到YouTube上。你还可以把HTML当作画刷,将其刻成锯齿形, 尽管录像还在播放过程中(使用了宿主在HTML中的Flash):

image

了解详情

留意一下Tim Heuer的博客以及John Papa的博客,他们会经常性地发表有关Silverlight的贴子,会在不久的将来发表一些对上面的应用做详细介绍的贴子。

结语

你可以在这里下载主题演讲中的示范(源代码,每个例程都包含了VS项目文件)。它们可用于公开的Silverlight 4 Beta + SL4 VS工具支持中。它们提供了一个很棒的方式,在你自己的机器上重温主题演讲的内容,还可以向朋友下秀一下这些示范。

希望本文对你有所帮助,

Scott

附注: 在主题演讲中展示的Facebook应用不久也会提供下载。我们还在往其中添加更多的特性,做些修饰,一旦完成,我会写贴做介绍。

posted on 2009-12-18 10:56:09 by scottgu  评论(0) 阅读(6461)

 

【原文地址】Search Engine Optimization (SEO) Toolkit
【原文发表日期】 Tuesday, December 15, 2009 12:24 AM

除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

在过去几个星期里,我一直在询问开发人员,看有多少人在使用新的搜索引擎优化(SEO)工具包来增加他们网站的流量。让我吃惊的是,有很多人要么从来没有听说过这个工具,要么还没有机会针对自己网站运行该工具。本博客将就为什么任何做web开发的人都应该看一下这个工具提供一个简单的摘要。

为什么要使用一个免费的SEO工具包?

简而言之,这个免费的SEO工具包分析器(SEO Toolkit Analyzer)帮助你增加你的网站的流量和访客,从而能够增加你通过网站直接或间接获取的收益。

这个SEO工具包分析器通过帮你评估和改进你的网站在象Google, Bing, 和 Yahoo这样的搜索引擎中的搜索相关性排行,来增加你网站的流量。随着你的搜索相关性排行的改进,以及你的网站对搜索引擎而言愈加优化,你会发现你的网站从搜索引擎查询中会得到越来越多的用户流量。

不需5分钟即可下载和运行SEO分析器

只需花费少于5分钟的时间即可下载SEO工具包分析器,并对你的网站运行该工具来进行分析。只要将工具指向你网站的顶层URL,然后它就会象搜索引擎一样自动地爬行你的网站 -- 跟随每个链接,分析每个网页的HTML,然后生成一个友好的报告,内含它在你的网站上发现的所有SEO或内容违例,以及如何修补每个违例的建议:

seo9 

可用于任何web服务器

该SEO工具包可用于任何web服务器,它可用于IIS5, IIS6, IIS7 和 IIS7.5,它甚至可用于运行于Linux上的Apache web服务器。基本上来说,你可以将SEO分析器指向任何一个远程的HTTP服务器,它就会爬行该网站,并且生成一个SEO报告。你需在远程服务器上安装任何软件,该工具会象搜索引擎一样远程爬行和分析一个网站。这意味着,你甚至可以针对你朋友(或潜在客户)的网站运行该工具,为他们生成报告。

SEO工具包到是要求你在本地开发/客户机器上安装IIS7管理工具,以宿主SEO分析管理UI工具。IIS7管理工具是Windows Vista, Windows 7, 和 Windows Server 2008的内置特性,IIS7管理界面只需在本地开发机器上安装即可,你需要将IIS7安装在服务器上。在其中运行的SEO工具,针对IIS5, IIS6 和其他web服务器都可以正常工作。

如何下载和安装SEO工具包

你可以使用微软Web平台安装器来轻松得安装SEO工具包。

要在你的开发机器上自动安装SEO工具包,使用IIS SEO工具包下载网页上的绿色“Install Now(现在就下载)”按钮,点击该按钮也会自动下载和安装Web平台安装器,如果你还没有安装它的话。

如何了解详情

夏天时,我曾写过一篇关于如何使用SEO工具包的教程(其中一些对话框的界面有些变动,但功能是一样的)。

你还可以观看这个IIS SEO 工具包录像 (5分钟长),或者这个长一点的IIS SEO 工具包录像 (15 分钟长),看SEO工具的实战例子。

你可以在www.iis.net上的SEO工具包论坛上提问求助。

结语

如果你还没有下载SEO工具包,用它来分析你的网站的话,那么我高度推荐你马上花上10分钟时间,尝试一下。你会发现它提供了一个非常简易和自动化的方式,很快地找到和鉴别你网站上的SEO问题,以及提供如何修补它们的建议。修补好这些问题就会增加你网站的流量和访客数。

希望本文对你有所帮助,

Scott

posted on 2009-12-18 10:00:00 by scottgu  评论(0) 阅读(7317)

 
2009年12月07日

【原文地址】My Presentations in Europe (December 2009)
【原文发表日期】 Sunday, December 06, 2009 6:04 PM

过去一个星期,我周游欧洲,做了多个讲座(在每个去的国家所做的讲座都近5个小时之久)--星期二在挪威,星期三在瑞典,星期四在丹麦,星期五在比利时。然后在这个周二,还会在法国的BizSpark Camp上再做演讲。

讲座进行得不错,很开心,认识了许许多多新朋友(参与讲座者超过3千人!)下面是比利时讲座会场的一张照片,参与者每个人都衣着红衫,:-)【译注:Scott做演讲时爱穿红衫出场】

belgium

讲座下载

我的讲座在几个地方都录了像,待它们上线后,我会更新本贴,提供录像链接。

下面是我的讲义和示范例程:

希望本文对你有所帮助,

Scott

附注: 除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

posted on 2009-12-07 10:40:40 by scottgu  评论(1) 阅读(7223)

 
2009年11月30日

【原文地址】Microsoft AJAX CDN – Now with SSL Support
【原文发表日期】 Sunday, November 29, 2009 5:55 PM

九月的时候,我曾在博客中写到ASP.NET开发团队目前正提供的新Microsoft AJAX CDN(内容分发网络)服务。该CDN提供了对AJAX 库 (包括 jQuery 和 ASP.NET AJAX)的边缘缓存(edge caching)支持。该服务是免费提供的,不需任何登记,可用于商业性和非商业性用途。这个服务提供了一个很好的途径来提高面向外部的网站的速度。

现在还提供了SSL支持

九月份时我们曾说过即将提供(但在初始发布时尚未提供)的一个特性是对CDN上提供的脚本的SSL支持。这对这样的场景来说是必需的:你在网站上有些启用了SSL的网页,你想要引用Microsoft CDN上的脚本库,而且要避免向访问你网站的终端用户显示“本页不但包含安全的内容,也包含不安全的内容”的安全警告。

在Microsoft AJAX CDN上宿主的那些脚本现在启用了SSL支持。只要对你网站上任何指向CDN的脚本引用使用“https”标记即可,然后这些脚本现在就会通过SSL来提供。例如,下面是在SSL上引用jQuery的例子:

   <script src="https://ajax.microsoft.com/ajax/jquery/jquery-1.3.2.min.js" type="text/javascript"></script>   

Microsoft AJAX CDN 文档最近已经更新了更多的细节。你可以访问此处以了解相关详情。该文档列出了目前通过CDN提供的所有脚本库。我们一直在往上面添加更多的脚本库,随着新的脚本的提供,该文档会不断更新。

希望本文对你有所帮助,

Scott

附注: 除了写博客外,我现在还使用Twitter发短贴和共享链接。请通过twitter.com/scottgu跟随我。

posted on 2009-11-30 11:00:28 by scottgu  评论(0) 阅读(6856)

 
【第1页/共24页,238条】
首页
前页
1
...