<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_二十四画生的Blog</title><subtitle type="text">——开始学习Orchard框架</subtitle><id>http://feed.cnblogs.com/blog/u/10555/rss</id><updated>2011-10-17T07:56:20Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/10555/rss"/><entry><id>http://www.cnblogs.com/esshs/archive/2011/10/17/2215471.html</id><title type="text">Orchard 1.3新功能之——规则（Rules）</title><summary type="text">本文主要介绍了Orchard 1.3中新增的规则（Rules）功能。</summary><published>2011-10-17T07:55:00Z</published><updated>2011-10-17T07:55:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/10/17/2215471.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/10/17/2215471.html"/><content type="html">&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; Orchard 1.3中新增了一个十分重要的功能，这就是规则（Rules）。它相当于一个事件触发器，可以在某个事件发生的时候执行某种操作。这个功能的最大亮点就是：事件和操作都可以由模块开发人员自由定义，使用者只用在后台管理中组合这些功能来达到自己所需的效果。最常见的应用就是邮件通知了。我们可以设定当有新评论提交的时候来通知管理员，这样就可以及时提醒管理员来处理所提交的评论了。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;启用Rules功能&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;首先如果要使用Rules功能就必须先启用它。进入Orchard后台管理的Modules菜单可以看见新增了一个Rules的分类。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0103.jpg" border="0" alt="" width="976" height="203" /&gt;&lt;/div&gt;&lt;div&gt;默认情况下（Orchard安装版），Rules分类下共有四个功能：&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Comments Rules：&lt;/strong&gt;定义了一个评论特有的操作&amp;#8212;&amp;#8212;关闭评论。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Contents Rules：&lt;/strong&gt;定义对内容操作的一些基本事件，如：创建内容，修改内容，发布内容和删除内容。Content是Orchard中一个基础内容，Orchard中的所有类型的内容都是继承它的。所以Content中定义事件适用于所有其他类型的内容。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Rules：&lt;/strong&gt;提供管理和配置系统事件触发的基本功能。所有的Rules功能都需要依赖于它，启用它后在后台就会新增一个Rules菜单用于对规则的管理。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Scripting Rules：&lt;/strong&gt;一个可以执行脚本语言的模块定义的规则。暂时不知道能做什么用。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;通常我们要用规则的功能就需要启用Rules和Content Rules这两个功能。另外还有一个Email Messaging模块在Orchard安装版中没有默认提供，但我们也可以去Gallery安装一个。在这个Email Message的Rules中定义了一个发送Email的操作。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;定义一个规则&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;下面我们就通过定义一个通知审核评论的规则，来体验一下Orchard规则的用法。&lt;/div&gt;&lt;div&gt;首先我们需要启用Rules、Content Rules和Email Rules这三个功能。并且配置好SMTP服务。安装Email Message后，可以在Settings下面可以看到一个Email菜单，再那里配置就可以了。&lt;/div&gt;&lt;div&gt;然后，进入Rules菜单，点击Add a new Rule按钮，再接下的界面中输入规则名称，如：&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0104.jpg" border="0" alt="" width="416" height="268" /&gt;&lt;/div&gt;&lt;div&gt;点击Save&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0105.jpg" border="0" alt="" width="778" height="469" /&gt;&lt;/div&gt;&lt;div&gt;点&amp;#8220;Add a new Event&amp;#8221;来添加一个评论创建的事件。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0106.jpg" border="0" alt="" width="779" height="365" /&gt;&lt;/div&gt;&lt;div&gt;选择ContentCreated事件&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0107.jpg" border="0" alt="" width="405" height="475" /&gt;&lt;/div&gt;&lt;div&gt;并指定此事件仅适用于Comment类型。点击Save后回到编辑规则的界面，再点击&amp;#8220;Add an Action&amp;#8221;。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0108.jpg" border="0" alt="" width="791" height="514" /&gt;&lt;/div&gt;&lt;div&gt;选择&amp;#8220;Send e-mail&amp;#8221;事件。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0109.jpg" border="0" alt="" width="788" height="529" /&gt;&lt;/div&gt;&lt;div&gt;配置需要提醒的对象及提醒邮件的内容。这里提醒对象设置为站点管理员，所以我们还需在Users里面添加好管理员的邮箱。（这个地方的提醒对象不能指定评论审核员，我觉得此处功能需要再细化，也许这个邮件提醒的规则应该做到评论模块中。希望能在以后的版本中Orchard能对这个地方有所改进。）另外看见邮件标题和内容旁边的那个小图标没有，这个表示此处的内容可以使用可替换关键字功能（Tokens）。这也是Orchard 1.3的新增功能，不过不是本文的重点就先不介绍了。点击Save回到规则编辑页面。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0120.jpg" border="0" alt="" width="789" height="538" /&gt;&lt;/div&gt;&lt;div&gt;最后点击&amp;#8220;Save and Enable&amp;#8221;就可以完成规则的配置了。（注：如果直接点击保存此规则是不会生效的，一定要启用才行）&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;最后，我们随便发表一个评论就能看见效果了。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;目前规则功能用下来的感觉就是功能还很简单，事件触发规则还比较弱，目前只能做到某一类型的内容，但是还不能限定某一时间范围，某一人操作的内容。也就是说我们可能需要更加细致的规则。但是总的来说规则功能的发展潜力应该是无限的。比如：消息通知，流程处理等地方应该都可以发挥它的作用。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2215471.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/10/17/2215471.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/10/08/2201668.html</id><title type="text">Orchard 1.3新功能之——Markdown编辑器</title><summary type="text">本文主要介绍了如何使用Orchard 1.3 新增的Markdown编辑器。</summary><published>2011-10-08T00:52:00Z</published><updated>2011-10-08T00:52:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/10/08/2201668.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/10/08/2201668.html"/><content type="html">&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; Orchard 1.3在不久前发布了，这个版本提供了不少新的功能，其中之一就是新增了Markdown编辑器。Markdown是一种轻量级的标记语言，可以用一些简单语法来表达一些富文本内容（更多关于Markdown知识可&lt;a href="http://baike.baidu.com/view/2311114.htm" target="_blank"&gt;点击这里&lt;/a&gt;）。在Orchard中我可以使用这个编辑器来替代原有的TinyMce编辑器。比如在添加博客文章或创建页面的时候我们就可以使用这种编辑器，下面将介绍如何使用此编辑器。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;启用Markdown功能&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;首先，我们进入Orchard管理后台，点击Modules菜单。在Features选项卡下的查询条件中输入&amp;#8220;Markdown&amp;#8221;就可以找到我们要使用的功能。（这个功能查找也是1.3新增的）&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0100.jpg" border="0" alt="" width="480" height="215" /&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;找到此功能后，点击Enable即可。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在博客文章中使用Markdown编辑器&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;默认博客文章用的是Html编辑器（就是TinyMce编辑器），我们可以在博客文章类型中调整这个设置。首先，在后台管理中进入Content菜单，选择Content Types选项卡找到Blog Post类型。编辑此类型，在Body部件中设置Flavor为markdown。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0101.jpg" border="0" alt="" width="480" height="651" /&gt;&lt;/div&gt;&lt;div&gt;保存后，再次添加或编辑博客文章的时候，我们看到的就是Markdown编辑器了。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;在Body Settings中，我们可以使用html，markdown和text这三种设置，分别对应TinyMce编辑器，markdown编辑器和textarea。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;体验Markdown编辑器&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;在以上工作都完成后，我们就可以发表一篇博客文章来体验一下Markdown编辑器的功能了。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0102.jpg" border="0" alt="" width="480" height="1086" /&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;从上图就可以看出，markdown编辑器十分简洁。基本的加粗、斜体和插入图片的功能都有。虽小但也够用了。另外插入图片的功能和TinyMce编辑器中一样，这样图片就能实现共享了。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;通过新增Markdown编辑器的功能可知，Orchard可以支持多种编辑器功能。以后我们也可以自己尝试扩展UBB编辑器、FCK编辑器等更多好用的编辑器。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;a href="http://www.davidhayden.me/blog/orchard-1.3-features-markdown-support-for-pages-blog-posts-and-content-authoring" target="_blank"&gt;http://www.davidhayden.me/blog/orchard-1.3-features-markdown-support-for-pages-blog-posts-and-content-authoring&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2201668.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/10/08/2201668.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/10/05/2199250.html</id><title type="text">Orchard 1.3 发布了！</title><summary type="text">Orchard 1.3版本发布了。</summary><published>2011-10-05T02:08:00Z</published><updated>2011-10-05T02:08:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/10/05/2199250.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/10/05/2199250.html"/><content type="html">&lt;p&gt;Orchard 1.3 发布了，此次更新了以下内容：&lt;/p&gt;&lt;p&gt;1、草稿预览；&lt;/p&gt;&lt;p&gt;2、 允许删除自定义类型和部件；&lt;/p&gt;&lt;p&gt;3、新增Markdown编辑器。（关于Markdown 的介绍可以&lt;a href="http://baike.baidu.com/view/2311114.htm" target="_blank"&gt;点击这里&lt;/a&gt;）&lt;/p&gt;&lt;p&gt;4、新增了标题部件（Title Part）。在以前的版本中标题是和Route部件在一起的。某些时候可能只用到标题而不需要Url，那么标题部件就很适用了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;5、新增了一个规则功能（Rules）。这是一个非常有用的功能。它可以支持在后台界面中为某些事件定义某些动作。比如：可以定义在评论创建的时候发送一封邮件给管理员。&lt;/p&gt;&lt;p&gt;6、&amp;nbsp;Forms API：支持通过Code来创建表单。在以前的版本中编写一个表单，需要编写：controllers 或 drivers、 view models 和 views。现在只用通过一段代码就能搞定。&lt;/p&gt;&lt;p&gt;7、 令牌（Tokens）：令牌是一个全系统的变量。其值可以根据上下文来变化。比如在上面将到的规则功能中，如果需要在发送给管理员的邮件中提到评论人，我们只用在邮件标题或内容中使用{Comment.Author}这个令牌就可以了。令牌就相当于一个可替换关键字。更多关于令牌功能的介绍可以点击：&lt;a href="http://weblogs.asp.net/bleroy/archive/2011/07/22/future-orchard-part-1-introducing-tokens.aspx" target="_blank"&gt;这里&lt;/a&gt;，&lt;a href="http://weblogs.asp.net/bleroy/archive/2011/07/27/future-orchard-part-2-more-tokens.aspx" target="_blank"&gt;还有这里&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;8、新的内容管理方式：增加Aggregate属性，允许预加载所有相关内容。允许在一次查询中返回多个内容Id。&lt;/p&gt;&lt;p&gt;9、 其他：RSS和本地化功能此次都有更新。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;参考文档&lt;/p&gt;&lt;p&gt;&lt;a href="http://weblogs.asp.net/bleroy/archive/2011/10/04/so-what-s-new-in-orchard-1-3.aspx" target="_blank"&gt;http://weblogs.asp.net/bleroy/archive/2011/10/04/so-what-s-new-in-orchard-1-3.aspx&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.sarasota.me/blog/orchard-13-released" target="_blank"&gt;http://www.sarasota.me/blog/orchard-13-released&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;1.3版下载地址：&lt;a href="http://orchard.codeplex.com/releases/69668/download/288792" target="_blank"&gt;http://orchard.codeplex.com/releases/69668/download/288792&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2199250.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/10/05/2199250.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/09/17/2179725.html</id><title type="text">Orchard中的计划任务功能（Schedule）</title><summary type="text">本文介绍了Orchard中的计划任务功能，以及如何去创建一个计划任务。</summary><published>2011-09-17T09:18:00Z</published><updated>2011-09-17T09:18:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/09/17/2179725.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/09/17/2179725.html"/><content type="html">&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 在很多时候CMS网站也需要用到计划任务的功能（Schedule），比如：定时发布内容、定期发送网站日志给管理员、定期生成网站静态页面等等。如果要自己去实现这种计划任务的功能需要写不少代码才能实现，但在Orchard中利用其框架所提供的接口就能很容易的实现计划任务的功能。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;IBackgroundTask 接口&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;在Orchard中如果需要实现计划任务的功能我们只需实现IBackgroundTask接口即可，Orchard框架会自动创建一个进程，每分钟去调用所有实现此接口的类（没启用的模块不会调用），并执行此接口的Sweep()方法。由于框架的支持，我们就不用再去关心系统是如何每分钟去执行一下Sweep()方法，而是把关注的重点转移到Sweep()方法需要做哪些事情上。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;下面我就通过一个简单的示例来介绍在Orchard中实现计划任务的功能是如此的简单。在以前的文章中我创建过一个HelloWorld模块。其功能就是实现在后台输入一段文字，然后在前台显示出来，详情可查看《&lt;a href="http://www.cnblogs.com/esshs/archive/2011/06/12/2078869.html" target="_blank"&gt;在Orchard中创建一个HelloWorld模块&lt;/a&gt;》。现在为了演示计划任务的功能，我们假定一个需求：系统会自动每分钟去更新HelloWorld的文字，并显示更新时的系统时间。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;首先，我们在Services目录中创建一个HelloWorldTask.cs文件，并输入以下代码：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('934153c8-d0bf-4acf-8103-3894fda75251')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"  id="code_img_opened_934153c8-d0bf-4acf-8103-3894fda75251" onclick="cnblogs_code_hide('934153c8-d0bf-4acf-8103-3894fda75251',event)" style="display:none"&gt;&lt;div id="cnblogs_code_open_934153c8-d0bf-4acf-8103-3894fda75251" &gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Linq;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;System.Web;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Orchard.Tasks;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MyCompany.HelloWorld.Services&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;只用实现IBackgroundTask接口就可以轻松实现计划任务功能了&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;HelloWorldTask&amp;nbsp;:&amp;nbsp;IBackgroundTask&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ITextService&amp;nbsp;_textService;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;HelloWorldTask(ITextService&amp;nbsp;textService)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_textService&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;textService;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Sweep()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;系统会每分钟执行一次此方法&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;我们可以在这里实现需要执行的内容&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;我们也在这里实现执行间隔的功能&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_textService.UpdateText(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello&amp;nbsp;World,&amp;nbsp;The&amp;nbsp;current&amp;nbsp;time&amp;nbsp;is:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;DateTime.Now.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;然后编译一下就可以了，简单吧&lt;img src="http://www.cnblogs.com/Emoticons/msn/regular_smile.gif" alt="" style="border-width: initial; border-color: initial; " /&gt;。回到前台，输入：http://localhost/HelloWorld&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0098.jpg" border="0" alt="" width="439" height="240" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;隔几分钟在刷新一下，就可以发现时间自己更新了。&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0099.jpg" border="0" alt="" width="460" height="233" /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;通过以上示例我可以看出在Orchard中实现计划任务的功能十分简单。但是同样也能看出它所提供的功能还非常弱。所谓的计划任务功能目前只是提供了后台一分钟执行一次的功能。如果需要间隔N分钟或是几点到几点执行都还需要在模块中编写相应的代码来实现。不过毕竟Orchard才刚刚起步，我相信在后续的版本中会不断的去完善，希望Orchard能实现像DotNetNuke中Schedule那样有一个管理配置计划任务的地方，并可以查看执行日志等。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;本示例代码下载：&lt;a href="http://files.cnblogs.com/esshs/Orchard.Module.MyCompany.HelloWorld.2.1.rar"&gt;点击这里&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2179725.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/09/17/2179725.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/09/15/2177011.html</id><title type="text">Orchard网站App_Data目录里的文件介绍</title><summary type="text">本文介绍了Orchard网站App_Data目录里都有哪些文件，以及这些文件的作用。</summary><published>2011-09-15T01:45:00Z</published><updated>2011-09-15T01:45:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/09/15/2177011.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/09/15/2177011.html"/><content type="html">&lt;div&gt;&lt;div&gt;在Orchard中App_Data文件夹是用来存放各种数据的。这些数据都包括：&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0097.jpg" border="0" alt="" width="196" height="216" /&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;cache.dat文件：&lt;/strong&gt;这是一个缓存文件，用xml的格式来描述每个Orchard子站中都启用了哪些功能。这仅是一个缓存文件，修改它会产生难以预料的结果。所以最好不要改动它。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;hrestart.txt文件：&lt;/strong&gt;这是一个由系统创建的文件，表示需要重新启动应用程序。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Dependencies目录：&lt;/strong&gt;这是一个用于存储动态编译dll的目录，该目录中的dependencies.xml文件可以显示每个模块是如何编译的。关于动态编辑的更多知识可查看《&lt;a href="http://www.cnblogs.com/esshs/archive/2011/07/27/2118050.html" target="_blank"&gt;Orchard动态编译机制&lt;/a&gt;》。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Exports目录：&lt;/strong&gt;数据导出目录。如果你启用了Import/Export模块，可以将网站内容导出到这个目录下。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Localization目录：&lt;/strong&gt;网站语言包文件目录。此处存放的是Orchard框架的语言包文件。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Logs目录：&lt;/strong&gt;这是存放系统日志的目录。查看日志文件可以检查系统在运行中都出现了哪些错误。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;RecipeQueue目录：&lt;/strong&gt;用于在安装过程中执行安装方案的队列。&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Sites目录：&lt;/strong&gt;这个目录下的每一个子目录都是一个子站点。缺省有一个Default目录，这是Orchard默认站点。这些子目录下面通常包含以下文件：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;mappings.bin：&lt;/strong&gt;这是一个缓存NHibernate映射的文件。在开发模块的时候可能会出现新增字段无法使用的问题，这时只用删除掉这个文件就可以了。&lt;span style="color: red; "&gt;（这一点很实用）&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Orchard.sdf：&lt;/strong&gt;如果你在创建子站的时候选择的是SQL CE数据库就会有此文件。这是一个 SQL CE数据库文件。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;reports.dat：&lt;/strong&gt;这是一种传统的日志文件格式。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Settings.txt：&lt;/strong&gt;描述子站的一些底层设置。如：采用何种数据库，数据库连接串是什么等。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Warmup目录：&lt;/strong&gt;这是一个存放静态页面的目录。如果你启用了Orchard.Warmup模块后，系统可以生成你所设置Url的静态页面。里面还有一个warmup.txt文件是用于指示最后一次生成静态页面的时间。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;a href="http://orchardproject.net/docs/Developer-FAQ.ashx#Whats_in_App_Data_15" target="_blank"&gt;http://orchardproject.net/docs/Developer-FAQ.ashx#Whats_in_App_Data_15&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2177011.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/09/15/2177011.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/09/03/2165416.html</id><title type="text">在Orchard中使用样式及脚本</title><summary type="text">本文介绍了在Orchard中使用样式和脚本的方法。</summary><published>2011-09-03T07:03:00Z</published><updated>2011-09-03T07:03:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/09/03/2165416.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/09/03/2165416.html"/><content type="html">&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; 在Orchard中开发模块我们可能会添加一些这个模块特有的样式或脚本。从web页面优化的角度来看，我们通常需要将样式添加到页面的头部（&amp;lt;head&amp;gt;标签处），而脚本则希望添加到页面地底部（靠近&amp;lt;/body&amp;gt;标签）。然而我们开发模块所对应的视图文件其实一个部分视图（PartialView），如果直接在视图中添加样式或脚本引用标签就无法达到我们希望的效果。那么在Orchard中是如何处理这一功能的呢？&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;在Orchard框架中重写了MVC视图引擎的WebViewPage类，新增了Script和Style属性用于引入样式和脚本。这样我们就可以在视图中直接使用这个两属性，来调用相应的方法了。&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在视图中使用内部样式和脚本&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;如果我们需要将样式定义或脚本定义直接写到页面中。那么我们可以通过把样式和脚本写入Orchard主题所定义的特定区域中。例如使用以下方法就可以把脚本写入页面的底部区域：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;@using (Script.Foot())&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;&amp;nbsp; &amp;nbsp; function JsSub() {&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; //这里可写脚本&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;在Orchard中Style属性并没有Head方法，也许是Orchard不希望我们使用内部样式吧。所以我们还是把样式放在一个外部样式文件中来引用好了。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在视图中使用外部样式和脚本&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;如果我们想在模块中的调用样式和脚本。那么我就可以通过Script和Style属性的Include方法，如：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;@{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;&amp;nbsp; Style.Include("xxx.css");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;&amp;nbsp; Script.Include("xxx.js");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;这样在呈现页面的时候的，orchard会自动调查找此模块中Styles目录下相应的样式文件并生成样式引用标签写在页面的头部。也会查找Scripts目录下相应的脚本文件并生成脚本引用标签写在页面的底部。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;使用资源文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;除了以上介绍的两种方法以外，Orchard还提供了一个资源文件清单的功能。我只需要在模块根目录中创建一个ResourceManifest.cs文件，并实现IResourceManifestProvider接口即可。在这个资源清单文件中，我们可以对样式和脚本文件的引用有更丰富的功能。&lt;/div&gt;&lt;div&gt;如：定义一个脚本文件的引用就可以用：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;public void BuildManifests(ResourceManifestBuilder builder) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="white-space:pre"&gt;	&lt;/span&gt;&lt;span style="color: #3366ff; "&gt;builder.Add().DefineScript("jQuery").SetUrl("jquery-1.5.2.min.js")&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;这样在视图上引用的时候可以用：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;@{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;Script.Require("jQuery ");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;而且定义好后其他模块也可以使用这一资源，并且在一个页面中有多个视图文件引用此资源时，也不会出现重复引用，Orchard只会生成一个引用此脚本的标签。&lt;/div&gt;&lt;div&gt;定义样式也一样：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;builder.Add().DefineStyle("jQueryUI_Orchard").SetUrl("jquery-ui-1.8.11.custom.css");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;使用时：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;@{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;Style.Require("jQueryUI_Orchard ");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;同时资源文件清单还有一个依赖设置的功能。就是当一个脚本资源需要依赖其他的脚本资源时，就可以使用以下定义：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;builder.Add().DefineScript("jQueryUI_Core").SetUrl("jquery.ui.core.min.js").SetDependencies("jQuery");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;这样我们只用在视图上使用jQueryUI_Core脚本，他会自动把它所依赖的jquery脚本也同时引入进来。&lt;/div&gt;&lt;div&gt;如果以脚本同时依赖多脚本，可以用逗号分隔多个依赖的资源，如：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;builder.Add().DefineScript("jQueryUI_Draggable").SetUrl("jquery.ui.draggable.min.js")SetDependencies("jQueryUI_Core", "jQueryUI_Widget", "jQueryUI_Mouse");&lt;/span&gt;&lt;/div&gt;&lt;div&gt;不过目前Orchard还不支持脚本资源依赖样式资源的功能，这有点可惜，其实有些js需要和样式文件同时使用的，如：jQueryUI插件。&lt;/div&gt;&lt;div&gt;另外，资源清单文件还可为调试模式和发布模式设置不同的脚本文件，并且还可以定义相应资源的版本，如：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #3366ff; "&gt;builder.Add().DefineScript("jQuery").SetUrl("jquery-1.5.2.min.js", "jquery-1.5.2.js").SetVersion("1.5.2");&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; Orchard中自带的Orchard.jQuery模块就是这样一个定义jQueryUI插件的模块。如果我们有需要用到这个插件的地方，就可以查看这个清单文件中所定义的js插件，并在我们自己的模块中引用他。不过值得注意的是：如果我们需要引用Orchard.jQuery模块中的内容，就需要在模块清单文件中设置依赖Orchard.jQuery模块，这样在启用我们的模块的时候就会同步启用Orchard.jQuery模块，确保我们所引用的资源都能正常调用。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2165416.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/09/03/2165416.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/08/28/2156362.html</id><title type="text">Orchard中的多站点功能（Multi-Tenant）</title><summary type="text">本文主要介绍了如何在Orchard中设置多个站点。</summary><published>2011-08-28T12:37:00Z</published><updated>2011-08-28T12:37:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/08/28/2156362.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/08/28/2156362.html"/><content type="html">&lt;div&gt;&#xD;
&lt;div&gt;&amp;nbsp; &amp;nbsp; 当你运行Orchard的时候，通常一个网站运行在一个应用程序域中。这也是一般ASP.NET应用程序区分两个网站的方法，也就是说两个网站，就需要部署两套网站应用程序。然而，Orchard提供了另外一种区分两个网站的方法。在Orchard中引入了多站点的概念（multi-tenancy，直译为多租户，但我觉得翻译为多站点更贴切），允许你在一个ASP.NET应用程序域中同时运行多个站点。从内存使用率的角度来看这是非常有用的，因为应用程序域的初始化、卸载和回收都是非常消耗资源的。在一个单独的应用程序域中运行多个独立的Orchard网站，就可以在一台服务器上配置更多的站点。做为主机托管商无疑会十分青睐这种方式，这样可以大量节约成本。就一般主机空间的租赁用户来说，也可以在一个主机空间中部署多个站点，这样也能省钱。多站点的功能在&lt;a href="http://orchardproject.net/docs/Deploying-Orchard-to-Windows-Azure.ashx" target="_blank"&gt;Windows Azure环境&lt;/a&gt;中会表现的更好，因为部署到Azure中就可以轻松支持多个站点了。&lt;/div&gt;&#xD;
&lt;fieldset&gt;&lt;legend&gt;备注&lt;/legend&gt;如果你想在本机测试多站点的功能，请先阅读&amp;#8220;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/08/28/2156362.html#a1"&gt;在本机测试多站点&lt;/a&gt;&amp;#8221; 一节然后在来阅读此文章。&lt;/fieldset&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;启用多站点功能&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;默认多站点功能是没有启用的。要启用多站点功能，可以登录后台管理系统，点击Modules菜单，找到Hosting分类下的Multi Tenancy功能，点击Enable。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0088.jpg" border="0" alt="" width="296" height="121" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;一旦多站点功能启用，你可以在后台管理系统中看见一个Tenants菜单（Tenants菜单只有在访问默认站点的时候才会出现，而通过子站点访问的时候就没有，这样就保证了只有默认站点的管理员才可以创建子站）。点击进入后可以看见一个Default站点，这是安装Orchard时默认创建的站点。你可以想象Default就像一个租户租了一整栋房子，当然你也可以把这栋房子租给更多的人。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span  style="font-size: 16px; font-weight: bold; line-height: 24px; "&gt;添加一个站点&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div&gt;首先，你只会有一个单一的站点，这是默认的站点。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0089.jpg" border="0" alt="" width="675" height="527" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;添加一个新的站点，可以点击&amp;#8220;Add a Tenant&amp;#8221;。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0090.jpg" border="0" alt="" width="529" height="406" /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;ul&gt;&#xD;
     &lt;li&gt;在添加站点页面，需要输入站点名称（名称不能包含空格）和站点域名。Orchard将通过用户访问的域名来映射到相应的网站。此外你还可以设置这个站点使用的数据库。共有三种选择：&lt;/li&gt;&#xD;
     &lt;li&gt;允许站点自己设置数据库。&lt;/li&gt;&#xD;
     &lt;li&gt;使用单独的SQL Server Compact数据库&lt;/li&gt;&#xD;
     &lt;li&gt;使用已存在的SQL Server 数据库&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;当设置好以上属性后，点击&amp;#8220;Save&amp;#8221;，在站点列表中就可以查看到刚刚添加的站点了。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0091.jpg" border="0" alt="" width="675" height="267" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;点击&amp;#8220;Set Up&amp;#8221;后将将跳转到Orchard安装页面。如果你不是选的&amp;#8220;允许站点自己配置数据库&amp;#8221;，将不会出现数据库的配置选项。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;fieldset&gt;&lt;legend&gt;备注&lt;/legend&gt;&#xD;
&lt;div&gt;如果你选择数据库的安装选项为使用已有数据库，那么需要填写已有数据库连接串和表前缀。这样就相当于一个网站使用的是一个独立的数据库。我认为这种实现方式要优于DNN那种不把不同站点数据混在一个表中的形式。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0092.jpg" border="0" width="433" height="589" alt="" /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;/fieldset&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;运行一个站点&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;每一个站点都可以有自己独有内容项目，启用不同的功能模块、使用不同的主题，进行独特的配置。不过，每一个站点可用的模块都是一样的。这是因为他们都共享同一个网站程序，所以可用模块也一样。在下面的截图中，展现了在不同的站点使用不同的主题的功能。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0093.jpg" border="0" alt="" width="675" height="581" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0094.jpg" border="0" alt="" width="675" height="572" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;你也可以随时停用一个站点，只要在默认站点的Tenants菜单中点击&amp;#8220;Suspend&amp;#8221;就可以停用相应站点了。停用后也可以点击&amp;#8220;Resume&amp;#8221;随时启用相应的站点。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0095.jpg" border="0" alt="" width="675" height="312" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;删除一个站点&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;目前，在界面上还没有提供删除站点的按钮。但是你可以在网站的App_Data/Sites目录下找到相应的站点名称同名的子目录，然后将其删除即可。你也可以先把这个目录备份到其他地方，这样如果你想恢复的时候就可以使用它了。&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;fieldset&gt;&lt;legend&gt;&#xD;
&lt;div&gt;备注&lt;/div&gt;&#xD;
&lt;/legend&gt;在Azure上，目前还没有办法删除，除非删除实际的数据库，并从BLOB存储更改配置。&lt;/fieldset&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;a name='a1' id='a1'&gt;&lt;/a&gt;&#xD;
&lt;p&gt;&lt;strong&gt;在本机测试多站点&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;如果你希望在本机配置多站点的功能，你首先需要修改一下本机的hosts文件。设置多个指向本机IP地址的域名。Hosts文件通常在 \Windows\System32\drivers\etc\hosts。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;用记事本打开这个文件，添加以下记录。&lt;/div&gt;&#xD;
&lt;div&gt;127.0.0.1&lt;span style="white-space:pre"&gt; &lt;/span&gt;t1.myhost.com&lt;/div&gt;&#xD;
&lt;div&gt;127.0.0.1&lt;span style="white-space:pre"&gt; &lt;/span&gt;t2.myhost.com&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;其次你需要在IIS中绑定这些域名。以IIS 7为例，可以选择相应的Orchard站点，点击右键找到&amp;#8220;编辑绑定&amp;#8221;项，再网站绑定对话框中添加刚刚在hosts文件中增加的域名。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0096.jpg" border="0" alt="" width="576" height="300" /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;这样你就可以在此Orchard网站中使用新增的两个域名来创建两个新的站点了。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;a href="http://orchardproject.net/docs/Setting%20Up%20a%20Multi-Tenant%20Orchard%20Site.ashx" target="_blank"&gt;http://orchardproject.net/docs/Setting%20Up%20a%20Multi-Tenant%20Orchard%20Site.ashx&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;img src="http://www.cnblogs.com/esshs/aggbug/2156362.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/08/28/2156362.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/08/25/2153066.html</id><title type="text">Orchard中的多语言功能</title><summary type="text">本文主要介绍了Orchard中的多语言功能。</summary><published>2011-08-25T05:12:00Z</published><updated>2011-08-25T05:12:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/08/25/2153066.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/08/25/2153066.html"/><content type="html">&lt;div&gt;&lt;div&gt;在Orchard中支持了两种本地化的方法：&lt;/div&gt;&lt;div&gt;1、对Orchard应用程序和模块中的一些文本字符串进行本地化。这个就相当程序本身的多语言支持，大多数的CMS系统都支持这一功能，如：DotNetNuke。&lt;/div&gt;&lt;div&gt;2、对网站内容的本地化。如：你在录入一篇新闻的时候可以同时录入中英文两种版本。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;本地化Orchard应用程序和模块&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;在Orchard应用程序中所有的文本字符串都是通过一个单独的T()方法输出的。这个方法可以根据当前站点的语言区域设置查找相应字符串的本地化翻译。默认情况下，Orchard提供英文（en-US）字符串，不过你也可以提供其它语言区域的。你可以通过添加语言包文件（.po格式）的形式翻译管理后台和前台网站中所有静态的字符串。下面的内容将介绍如何下载并安装一个语言包文件，并设置使用它。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;fieldset&gt;&lt;legend&gt;备注&lt;/legend&gt;&lt;p&gt;&lt;span style="background-color: #dcdcdc; "&gt;在.Net应用程序中，本地化通常是通过使用资源文件（.resx）和附属程序集来实现的。Orchard需要一个更轻量级的方法，这就是使用.po文件。在Orchard中，语言包文件的数量等于模块数量乘以所支持的语言。这个数字还可能会不断增长，这样附属程序集的设计就不再适用这种需求了。另一方面，.po文件按照需要被加载或卸载就像.resx文件一样，且在许多工具中.po文件都是以一个标准的存储格式。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/fieldset&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安装语言包文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;作为一个例子，我们来下载并设置一个简体中文（zh-CN）的语言包文件。在下面的地址中可以下载到我们所需的语言包文件：&lt;/div&gt;&lt;div&gt;&lt;a href="http://orchardproject.net/Localize/zh-CN" target="_blank"&gt;http://orchardproject.net/Localize/zh-CN&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;点击Download the PO files并将所下载的.zip文件保存到你的电脑中。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="background-color: #ffff99; "&gt;方法一：直接解压语言包文件&lt;/span&gt;&lt;/p&gt;&lt;div&gt;解压刚刚下载的语言包文件到网站的根目录下。确保你解压的内容都提取到了网站根目录下，而不是以zip文件名命名的子目录中。这种方法通过解压语言包文件将po文件复制到你的网站目录下。这是一个非常简单的方法，但是如果语言包中有的模块，而你网站中并没有。这样就会多出一些目录来，如果你不想看的这样的结果，那么接下来的方法就可能更适合你了。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="background-color: #ffff99; "&gt;方法二：使用翻译管理（Translation Manager）模块来安装语言包文件&lt;/span&gt;&lt;/p&gt;&lt;div&gt;首先你需要从Orchard软件商店中下载并安装&lt;a href="http://orchardproject.net/gallery/List/Modules/Orchard.Module.Vandelay.TranslationManager" target="_blank"&gt;Translation Manager&lt;/a&gt;模块。一旦这个模块安装好后，你就可以在命令行工具中通过以下命令来安装语言包文件了。&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0000ff; "&gt;install translation c:\temp\zh-CN.zip&lt;/span&gt;&lt;/div&gt;&lt;div&gt;c:\temp\zh-CN.zip就是你刚刚下载文件保存的位置，而关于命令行工具的用法可以&lt;a href="http://www.cnblogs.com/esshs/archive/2011/06/09/2076129.html" target="_blank"&gt;查看这里&lt;/a&gt;。&lt;/div&gt;&lt;div&gt;运行此命令后，已存在的模块将会安装相应的po文件。而没有存在的模块，也不会去创建多余的目录来安装po文件。如果你以后再安装新的模块，就再重新运行一次这个命令就可以了。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;设置站点语言&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;设置当前站点的默认语言可以在后台管理中点击&amp;#8220;Settings =&amp;gt; General&amp;#8221;。在Default Site Culture下面点击Add or remove supported cultures for the site。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0078.jpg" border="0" alt="" width="406" height="109" /&gt;&lt;/div&gt;&lt;div&gt;在Cultures页面，从可用语言区域列表中选择一个语言区域添加即可。如果要移除一个语言区域只用在相应已添加的语言区域后面点X即可。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0079.jpg" border="0" alt="" width="454" height="375" /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;在你添加一个或多个语言区域以后，点击General菜单，回到Manage Settings页面。在Default Site Culture中选择本站的默认的语言。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0080.jpg" border="0" alt="" width="451" height="346" /&gt;&lt;/div&gt;&lt;div&gt;设置了刚刚安装的那种语言包语言区域后，网站的后台界面就变成简体中文的界面。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0081.jpg" border="0" alt="" width="599" height="390" /&gt;&lt;/div&gt;&lt;div&gt;当然界面上的内容也不是完全都翻译了的，那是因为有些内容是语言包中没有的模块，还有些内容是动态内容。接下来我们会接着介绍如何完善这两项剩余的翻译工作。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;设置默认语言区域为一个其他的语言区域不会有任何影响，除非你安装了相应的语言包文件。Orchard将通过查找以下路径来获取相应的语言包文件。&lt;/p&gt;&lt;p&gt;&lt;span  style="color: #3e483c; font-family: Frutiger, 'Frutiger Linotype', Univers, Calibri, 'Gill Sans', 'Gill Sans MT', 'Myriad Pro', Myriad, 'DejaVu Sans Condensed', 'Liberation Sans', 'Nimbus Sans L', Tahoma, Geneva, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #ffffff; "&gt;&lt;table cellpadding="4" border="1" style="border-collapse: collapse; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;tbody&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;核心模块本地化文件路径&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;em&gt;~/Core/App_Data/Localization/&amp;lt;culture-code&amp;gt;/orchard.core.po&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;普通模块本地化文件路径&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;em&gt;~/Modules/&amp;lt;module-name&amp;gt;/App_Data/Localization/&amp;lt;culture-code&amp;gt;/orchard.module.po&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;主题本地化文件路径&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;em&gt;~/Themes/&amp;lt;theme-name&amp;gt;/App_Data/Localization/&amp;lt;culture-code&amp;gt;/orchard.theme.po&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;全局站点通用本地化文件路径&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;em&gt;~/App_Data/Localization/&amp;lt;culture-code&amp;gt;/orchard.root.po&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;虚拟子站通用本地化文件路径&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;em&gt;~/App_Data/Sites/&amp;lt;tenant name&amp;gt;/Localization/&amp;lt;culture-code&amp;gt;/orchard.po&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;可用的语言包文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;你可以在&lt;a href="http://orchardproject.net/localize" target="_blank"&gt;http://orchardproject.net/localize &lt;/a&gt;中下载已有的语言包文件，这些语言包文件是大家提供的。如果你找不到相应的语言包文件，请考虑帮忙翻译一下。它只用花费你几个小时的时间，但是将有利于整个社会。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;贡献新的语言包文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;当你找不到可用的语言包文件时，或可用的语言包中有存在错误或缺失时。你可以通过下面的介绍来创建和完善语言包文件，并提供给Orchard来造福大家。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="background-color: #ffff99; "&gt;通过记事本来修改语言包文件&lt;/span&gt;&lt;/p&gt;&lt;div&gt;在http://orchardproject.net/Localize中可为你提供一个待翻译的语言包文件模板。找到Create a new translation部分，并选择你需要翻译的语言，点击&amp;#8220;Create&amp;#8221;。然后会跳转到一个新的页面，点击&amp;#8220;Download the PO files&amp;#8221;来下载这个模板文件。&lt;/div&gt;&lt;p&gt;解压刚刚下载下来的语言包模板文件，找到里面的.po文件并用记事本打开它。然后翻译完成里面相应的内容，翻译完所有的po文件后重新压缩这个文件夹，并将你所翻译的内容发送邮件join-orchard-localization@lists.outercurve.org就可以了。他们会把你翻译的内容放到可用语言包列表中的。&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;你需要在保存.po文件时，将文件编码格式设置为UTF-8。这个通常在另存为的时候，在保持按钮旁边的编码下拉框中选择。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #993366; "&gt;语言包文件格式&lt;/span&gt;&lt;/p&gt;&lt;div&gt;下面将介绍如何去翻译一个语言包文件。下表列出了语言包文件中的一个翻译条目对应的一些元素：&lt;/div&gt;&lt;p&gt;&lt;span  style="color: #3e483c; font-family: Frutiger, 'Frutiger Linotype', Univers, Calibri, 'Gill Sans', 'Gill Sans MT', 'Myriad Pro', Myriad, 'DejaVu Sans Condensed', 'Liberation Sans', 'Nimbus Sans L', Tahoma, Geneva, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #ffffff; "&gt;&lt;table cellpadding="4" border="1" style="border-collapse: collapse; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;tbody&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;div&gt;使用位置，注明是再什么位置使用这个翻译条目的&lt;/div&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;code style="font-style: normal; font-family: 'Courier New', 'Lucida Console', monospace; font-size: 13px; color: #000000; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;#: reference-string&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;div&gt;条目ID，这通常是原始未翻译的字符串。这个ID设置后，此字符串不应该再修改。&lt;/div&gt;&lt;p&gt;即使是英文字符串有变化也可以让现有的一些其它语言翻译在不更新的情况下能继续工作。&lt;/p&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;code style="font-style: normal; font-family: 'Courier New', 'Lucida Console', monospace; font-size: 13px; color: #000000; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;#| msgid "id-string"&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;div&gt;当前的英语字符串，这个可以作为我们翻译的基础。&lt;/div&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;code style="font-style: normal; font-family: 'Courier New', 'Lucida Console', monospace; font-size: 13px; color: #000000; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;msgid "English-string"&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;div&gt;需要翻译的内容&lt;/div&gt;&lt;/td&gt;&lt;td style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;&lt;code style="font-style: normal; font-family: 'Courier New', 'Lucida Console', monospace; font-size: 13px; color: #000000; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;msgstr "translated-string"&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0082.jpg" border="0" alt="" width="578" height="438" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="color: #993366; "&gt;翻译条目的引用位置&lt;/span&gt;&lt;/div&gt;&lt;div&gt;在一个.po文件中翻译条目引用位置是可选的。如果没有指定翻译条目的引用位置，它将作为一个相同ID且未找到相应引用位置的翻译条目时的后备资源。这种方式可以用于一个应用程序中的通用字符串，比如Save，这样在应用程序中多次出现Save时，只用一个翻译条目就可以了。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;翻译条目的引用位置可以是不同的位置，这取决于应用程序中是如何使用翻译条目的，引用位置通常有以下几种：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;视图中使用的：&lt;/strong&gt;引用位置为视图文件的虚拟路径，如：~/Themes/TheThemeMachine/Views/User.cshtml&lt;/li&gt;&lt;li&gt;&lt;strong&gt;.cs文件中使用的：&lt;/strong&gt;引用位置为相应类的完全限定类型名称，如：Orchard.Packaging.AdminMenu&lt;/li&gt;&lt;li&gt;&lt;strong&gt;模块和主题清单文件中使用的：&lt;/strong&gt;引用位置为清单文件的虚拟路径，如：~Themes/TheThemeMachine/Theme.txt。请注意，模块和主题清单的msgId，为相应字段的名称，如：作者在翻译时所用的msgId为Author。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="background-color: #ffff99; "&gt;在线修改语言包文件&lt;/span&gt;&lt;/p&gt;&lt;div&gt;这个要发邮件给Orchard才能注册相应的帐号，所以没有试过。大家可以&lt;a href="http://orchardproject.net/docs/Creating-global-ready-applications.ashx#Working_with_the_online_translation_tool_6" target="_blank"&gt;点击这里&lt;/a&gt;了解相应的内容。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="background-color: #ffff99; "&gt;提供第三方模块的语言包文件&lt;/span&gt;&lt;/p&gt;&lt;div&gt;Orchard所提供的可用语言包文件只包含了一些常用的模块。如果是我们自己开发的模块，就需要我们自己提供语言包文件了。我们可以在安装Translation Manager后，在命令行工具中使用下面的命令来创建自己模块的语言包文件，如：&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0000ff; "&gt;extract default translation /Extensions:Bing.Maps /Output:\temp&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;这个命令将查找你模块中所有带有T()方法的字符串和模块清单文件中的字段以及其他需要翻译的内容，并将其生成一个语言包文件Orchard.en-us.po.zip到你指定的目录中。你也可以将这个文件发送到orchardfeedback@outercurve.org中，Orchard会把你模块的语言包文件加入到在线翻译数据库中，并提供给大家下载。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;本地化网站内容&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;除了本地化网站和模块中的一些静态字符串以外，Orchard还提供了本地化网站内容的功能。首先你需要启用Localization功能，在Orchard管理后台中点击Modules菜单，找到Localization功能，点击Enable即可。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0083.jpg" border="0" alt="" width="675" height="297" /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;默认Page类型和Blog Post类型将自动加上Localization部件。你也可以添加Localization部件到其他你需要翻译的内容类型中去。在后台管理系统中点击Content菜单，你可以在某些内容下面看见一个+ New Translation的链接。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0084.jpg" border="0" alt="" width="675" height="489" /&gt;&lt;/div&gt;&lt;div&gt;注意：这个链接只在你的站点设置支持多种语言时显示。设置方法见上文所述。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;点击+ New Translation链接后，就会出现一个翻译内容的页面。用于翻译你所要翻译的父内容（就是网站缺省语言的那个内容），每一种翻译的内容都会做为Orchard中一个独立的内容项存在。在翻译内容的界面中，你可以选择相应需要翻译的语言，内容的链接也会相应的加上这种语言名称作为后缀。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0085.jpg" border="0" alt="" width="675" height="469" /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;翻译完成后点击Save后，回到前台网站，找到刚刚翻译的内容。你会发现在页面中多处了一个翻译版本的区域，如下图：&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0086.jpg" border="0" alt="" width="675" height="194" /&gt;&lt;/div&gt;&lt;div&gt;点击相应的语言版本，将会跳转到相应语言版本的内容页面。&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0087.jpg" border="0" alt="" width="675" height="212" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;fieldset&gt;&lt;legend&gt;备注&lt;/legend&gt;&lt;span style="background-color: #dcdcdc; "&gt;本地化功能是一个正在完善的功能，不是所有Orchard中的功能都支持本地化。例如：Orchard还不能提供通过自动获取当前浏览器默认的语言区域来展现相应可用翻译的内容。这个功能将在未来的版本中实现，在此之前你可以在模块中使用ICultureSelector接口，来实现这样的需求。如果你有其他关于本地化实现的方法或需求，可以发邮件到join-orchard-localization@lists.codeplex.org。&lt;/span&gt;&lt;/fieldset&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;a href="http://orchardproject.net/docs/Creating-global-ready-applications.ashx" target="_blank"&gt;http://orchardproject.net/docs/Creating-global-ready-applications.ashx&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2153066.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/08/25/2153066.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/08/21/2147718.html</id><title type="text">Orchard中的列表功能</title><summary type="text">本文主要介绍了Orchard中列表功能的用途和用法。</summary><published>2011-08-21T04:09:00Z</published><updated>2011-08-21T04:09:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/08/21/2147718.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/08/21/2147718.html"/><content type="html">&lt;div&gt;&amp;nbsp; &amp;nbsp; 在Orchard中，你可以创建自定义的内容项并指定在某一导航菜单中显示。如果你有多个自定义内容项，你可能希望它们能以列表的形式来显示。本文将告诉你该如何完成此操作。在演练中你需要先创建一个自定义内容类型并用列表来显示。更多关于创建自定义内容类型的知识可查看《&lt;a href="http://orchardproject.net/docs/Creating-custom-content-types.ashx" target="_blank"&gt;Creating Custom Content Types&lt;/a&gt;》。如果你对Orchard内容管理的方式还不太了解，或是对内容类型、内容部件、内容项这些名词比较陌生，建议你先&lt;a href="http://www.cnblogs.com/esshs/archive/2011/06/14/2080242.html" target="_blank"&gt;点击这里&lt;/a&gt;，查看一些关于Orchard基本概念的知识。&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建一个内容类型&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;首先，我们将创建一个关于书评的内容类型。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;在Orchard管理后台中，点击Content菜单并选择Content Types选项卡。然后点击Create New Type，在接下的画面中输入如下图所示内容：&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0058.jpg" width="675" height="264" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;点击Create后，你可以为新添加的内容类型选择一些内容部件。在这里我们将用到以下几种内容部件：&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Body（富文本内容部件）&lt;/strong&gt;：可提供一个富文本的编辑器，你可以输入更多关于书籍的评论。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Comments（评论部件）&lt;/strong&gt;：可以让其他用户也参与书籍的评论。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Common（通用部件）&lt;/strong&gt;：提供一些基本的属性，如：创建人，创建时间，发布时间等等。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Containable（集合部件）&lt;/strong&gt;：这个部件可以允许把相关的内容添加到某一个集合中去。这是实现以列表形式显示内容项的关键。&lt;span style="color: red;"&gt;注意&lt;/span&gt;：在使用Containable部件时，必须要同时添加Common部件，否则你将无法使用列表功能。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Route（路由部件）：&lt;/strong&gt;可提供一个Url来访问某一条书评。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Tags（标签部件）：&lt;/strong&gt;可以让你为书评增加一些标签。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0059.jpg" width="675" height="451" /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;点击Save后，你还可以为这个新的类型提供一些新的字段。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0060.jpg" width="675" height="518" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;在这里我需要添加以下两个字段（注意字段名称不能有空格或其特殊字符）。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;strong&gt;Buy：&lt;/strong&gt;购买网址。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;strong&gt;Verdict：&lt;/strong&gt;购买建议，如可给出&amp;#8220;购买&amp;#8221;、&amp;#8220;阅读&amp;#8221;或&amp;#8220;忽略&amp;#8221;之类的建议。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0061.jpg" width="686" height="323" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;当你完成了这两个字段的添加，一个新的内容类型就创建完成了，点击Save就OK了，如下图：&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0062.jpg" width="675" height="873" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;现在，在管理后台的New菜单下就会多出一个新的菜单&amp;#8220;Book Review&amp;#8221;。不过我们先别急着点这个菜单。我们还需要创建一个内容容器（container，可理解为一个内容集合），来将某一类的书评放在一起。&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0063.jpg" width="231" height="171" /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建一个内容列表&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;创建一个书评的列表，我们可以在New菜单中点击List菜单项。在所显示的画面中按照下图来输入：&lt;/div&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0064.jpg" width="675" height="708" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;这里设置了这个列表的名称和显示网址，还设置了这个列表中只能包含书评类型的内容，同时还设置了这个列表中内容项的排序规则和分页大小以及在菜单中显示的名称。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;添加内容&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;现在，我们可以来添加书评内容了。在Orchard管理后台的New菜单下点击Book Review菜单项，按下图所示输入一些书评信息，注意在Add to下拉列表中需要选择我们刚创建的书评列表，这样才能让书评内容以列表形式显示，最后还需要记得按Publish Now按钮，否则前台不会显示的。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0065.jpg" width="675" height="937" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;显示列表&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;想要查看我们刚刚创建的那个书评列表，只需要回到前台网站点击&amp;#8220;Book Reviews&amp;#8221;就可以了。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0066.jpg" width="675" height="549" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;自定义列表显示&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;书评内容类型使用了一个文本字段来显示购买网址，因为文本字段是Orchard中默认提供的功能。不过，文本字段不能很好的将Url地址显示为一个网址链接，如果有一个Url字段就更好了。但是现在没有专门的Url字段来使用，所以我们只能通过自定义文本字段的显示模板来让网址显示成为一个链接。我们可以在当前主题目录下面创建一个新的模板来替换默认的文本字段模板，如添加以下文件：&lt;/div&gt;&#xD;
&lt;div&gt;~/Themes/Current theme for your site/Views/Fields/Common.Text.cshtml&lt;/div&gt;&#xD;
&lt;div&gt;然后复制以下代码到这个文件&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('5e012bd7-870f-4c51-ab83-9e440eb6c40e')"&gt;&#xD;
@{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;name&amp;nbsp;=&amp;nbsp;Model.Name;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;value&amp;nbsp;=&amp;nbsp;Model.Value;&lt;br /&gt;&#xD;
}&lt;br /&gt;&#xD;
@if&amp;nbsp;(HasText(name)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;HasText(value))&amp;nbsp;{&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;p&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="text-field"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;@if&amp;nbsp;(name&amp;nbsp;==&amp;nbsp;"Buy")&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;a&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;href&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="@value"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;nbsp;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="value"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Buy&amp;nbsp;this&amp;nbsp;book&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;a&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;else&amp;nbsp;{&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;span&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="name"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@name.CamelFriendly():&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;span&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;span&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;class&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="value"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@value&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;span&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;p&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
}&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;这个模板就可以让当字段名称为Buy的时候，以链接的形式来显示。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;此外，你还可以自定义这个书评内容类型中各内容部件的显示位置和显示方式。你可以在当前主题目录下面创建一个placement.info文件或是修改已有文件并添加以下代码来控制书评内容的显示。&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('8a3e266f-073e-4c43-aecf-39baea1cef30')"&gt;&lt;img style="display: none;" id="code_img_opened_8a3e266f-073e-4c43-aecf-39baea1cef30"  onclick="cnblogs_code_hide('8a3e266f-073e-4c43-aecf-39baea1cef30',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div id="cnblogs_code_open_8a3e266f-073e-4c43-aecf-39baea1cef30" &gt;&#xD;
&lt;div&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Placement&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Match&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;ContentType&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="BookReview"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Match&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;DisplayType&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Detail"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Place&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Parts_Common_Body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Content:before"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parts_Tags_ShowTags&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Content:after"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parts_Comments&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Footer"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Match&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Match&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;DisplayType&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Summary"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Place&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Parts_Common_Body_Summary&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Content"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parts_Comments_Count&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Nowhere"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parts_Tags_ShowTags&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Nowhere"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Parts_Common_Metadata_Summary&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Nowhere"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Fields_Common_Text&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;="Nowhere"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Match&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Match&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&#xD;
&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;Placement&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;以上位置文件在第一级Match节点中定义只对书评内容有效，在第二级的Match节点中分别定义详情模式（Detail）和摘要模式（Summary）中不同的显示内容和显示位置。关于更多placement.info文件的内容可以查看《&lt;a href="http://www.cnblogs.com/esshs/archive/2011/08/02/2124836.html" target="_blank"&gt;理解Orchard中的placement.info文件&lt;/a&gt;》。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;当以详情模式显示的时候，位置文件定义Body部分在Content区域显示且位置靠前，Tags部分在也在Content区域显示且位置靠后。Comments部分显示在Footer区域中。如果当前你是以admin用户身份登录的，就先注销一下登录，作为一个普通用户来访问一个书评，你就可以看到以下的内容。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0067.jpg" width="675" height="744" /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;当书评内容以列表形式显示的时候。你希望显示一个更多链接，并以标题加摘要的形式来显示每一个书评，而其他内容如评论数，标签，创建时间等就不用在列表中体现了。上文placement.info文件就在摘要模式中设置那些不希望显示的内容到Nowhere区域中。Nowhere区域并不是一个已定义的Orchard区域，它只是为了隐藏某些内容而定义的一个不存在的区域。属于这个区域的内容就不会在页面中呈现了。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0068.jpg" width="675" height="439" /&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;fieldset&gt;&lt;legend&gt;注意&lt;/legend&gt;本节中所指的区域只是一个局部区域，并不是主题里Layout文件中的定义的区域，而是像/Core/Contents/Views/Items/Content.Summary.cshtml这样的文件中定义的区域。&lt;/fieldset&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;把列表作为一个Widgets来显示&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;接下的任务就是如何能让书评列表以Widgets的形式显示在首页的右边区域，来显示最新的5条书评。你将用到一个Container Widget对象来实现这个需求。&lt;/div&gt;&#xD;
&lt;div&gt;重新用admin身份登录网站，并进入网站管理后台，点击Widgets菜单。在Current Layer中选择TheHomePage层。在区域列表中，找到AsideSecond区域，然点击旁边的Add按钮，选择Container Widget。在接下的画面中按下图所示输入内容：&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0069.jpg" width="675" height="656" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;点击Save后回到首页就可以看见刚刚添加的最新书评了。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0070.jpg" width="675" height="367" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;创建自定义列表Widget&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;我们还能使用筛选功能，如实现一些自定义字段Custom1, Custom2和 Custom3的筛选。这样我们就可以实现在列表中显示满足某些特点条件的内容项了。要用这一功能，你需要在书评内容中新增一个Custom Properties部件。&lt;/div&gt;&#xD;
&lt;div&gt;我们在管理后台中的Content菜单中，选择Content Types选项卡。找到我们刚刚创建的书评内容类型，点击Edit，添加一个Custom Properties部件。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0071.jpg" width="356" height="359" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;点Save后，返回书评页，编辑以前添加的书评内容项。我们可以看见三个新的属性。在Custom One中输入Featured，来表示这类书评是比较有特色的。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0072.jpg" width="425" height="664" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;这样我们就可以使用过滤功能，在首页的右侧只显示最新的特色书评了。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;进入管理后台中的Widgets菜单，选择当前层为TheHomePage，找到我们刚刚添加的Latest Book Review widget，编辑它。在随后的画面中选中Filter items选项，选择Custom 1属性等于Featured。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0073.jpg" width="461" height="526" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;我们再次回到网站首页，右侧区域就只会显示那些特色书评了。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0074.jpg" width="675" height="429" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;当然我们也可以添加多个Widgets，一个用于显示特色书评，一个用于显示最新书评。添加操作和上文介绍的差不多，就不再赘述了，大家有兴趣可以试试把最终显示效果弄成下图这样：&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0075.jpg" width="354" height="585" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;列表的分页功能&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;列表功能还可以支持分页显示内容。回到管理后台在Content菜单中的找到以前添加的Book Reviews列表，在编辑画面中我们可以看到有一个PageSize的属性，这里可以设置分页大小，我们可以设置一个比较小的数字来测试一下分页功能，记得还要同时选中Show paging controls。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0076.jpg" width="381" height="673" /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;点击Save后再次回到前台网站的Book Reviews页面，在底部我们就可以看见一个Older按钮了。点击它就能查看下一页的内容。&lt;/div&gt;&#xD;
&lt;div&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/esshs/oc0077.jpg" width="675" height="254" /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;fieldset&gt;&lt;legend&gt;注意&lt;/legend&gt;&#xD;
&lt;div&gt;分页功能只在以页面形式显示列表的时候有效，以Widget方式显示的时候并不起作用。这是出于设计考虑的，因为在Widget启用分页功能，可能会导致同一页面中其他有分页设置的内容的显示受其影响。&lt;/div&gt;&lt;/fieldset&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;本文主要介绍了Orchard中列表功能的用途和用法。通过本文的学习我们可以更加深入的了解Orchard中内容组织的方式，活用列表功能可为我们自定义Orchard站点开辟一片新的天地。&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;a href="http://orchardproject.net/docs/Creating-lists.ashx" target="_blank"&gt;http://orchardproject.net/docs/Creating-lists.ashx&lt;/a&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
 &#xD;
 &lt;img src="http://www.cnblogs.com/esshs/aggbug/2147718.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/08/21/2147718.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/esshs/archive/2011/08/17/2142855.html</id><title type="text">Orchard中的用户、角色及权限</title><summary type="text">本文主要介绍了Orchard中内容操作权限控制的基本原理，以及如何使用用户（Users）、角色（Roles）及权限（Permissions）这三者的关系来实现对内容操作权限的控制。</summary><published>2011-08-17T03:20:00Z</published><updated>2011-08-17T03:20:00Z</updated><author><name>二十四画生</name><uri>http://www.cnblogs.com/esshs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/esshs/archive/2011/08/17/2142855.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/esshs/archive/2011/08/17/2142855.html"/><content type="html">&lt;div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; Orchard提供了一套管理用户及角色的功能，一个用户可以拥有多种角色，一个角色也可分配给多个用户。一个角色可以拥有多种操作权限，一种操作权限也可赋予多个角色。对一个用户指定不同的角色，他就可以拥有不同的权限了。Orchard判断当前用户是否能进行某种操作，就是判断他是否拥有这种操作的权限。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;管理用户&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;管理用户，可以在Orchard后台管理中选择&amp;#8220;Users&amp;#8221;菜单来进行管理。&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0053.jpg" border="0" alt="" width="746" height="334" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;缺省只有一个用户，就是你安装网站时创建的管理员用户。你可以在这里添加更多新的用户，当然你可以删除、修改或禁用用户。&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;当你添加一个新的用户时，你需要指定用户名，email和密码，并且还可以同时选择这个用户所拥有的角色。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0054.jpg" border="0" alt="" width="467" height="601" /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;角色定义了一个用户能在网站中进行什么样的操作。换句话说，就是有哪些操作允许他们执行。一个用户的有效权限是集合了他所有角色中的权限。权限仅用做允许用户执行什么样的操作，而不是拒绝他们进行什么样的操作。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;上面的描述举例来说就是：如果用户A同时拥有注册用户角色和新闻编辑角色，且注册用户角色可以评论新闻和回复评论，新闻编辑角色可以发表新闻。那么用户A就同时拥有评论新闻、回复评论和发表新闻的权限。这就是所谓的&amp;#8220;集合了他所有角色中的权限&amp;#8221;。但是如果有这种需求：用户A需要拥有回复评论的权限和发表新闻的权限，但是他不能拥有评论新闻的权限。那么在Orchard中只定义注册用户角色和新闻编辑角色，就无法实现这个需求了。因为&amp;#8220;权限仅用做允许用户执行什么样的操作，而不是拒绝他们进行什么样的操作&amp;#8221;，所以遇到这种情况，只能是重新定义一个新的角色，拥有回复评论权限和发表新闻权限，但是不具有评论新闻权限。不过在一些其他的CMS系统中，是支持拒绝某种权限定义的。比如新版本的DNN（3.X版的DNN也Orchard一样不支持拒绝权限的定义，不过新版本的支持了），就可以设置某一个角色拒绝执行某种操作。这样在配置权限的时候会更灵活一些，不知Orchard在以后的版本中是否会考虑升级这部分的内容。另外DNN在用户角色这一块还有一些很值得借鉴的地方，比如：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;角色的订阅：用户可以购买拥有某一角色，比如定义一个VIP角色，可以让用户去购买。&lt;/li&gt;&lt;li&gt;角色有效期：这样就可以实现用户在某一时间段内拥有某一角色，过期自动失效。&lt;/li&gt;&lt;li&gt;角色组：可以对角色进行分组，这个当角色多的时候就非常有用了。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;管理角色&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;管理角色，可以在Users界面中的Roles选项卡中配置某一角色所具有的权限，或是添加一些新的角色。&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0055.jpg" border="0" alt="" width="732" height="542" /&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Orchard默认定义了以下一些角色：&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Administrator （管理员）：拥有所有的权限。&lt;/li&gt;&lt;li&gt;Editor （网站编辑）：可以管理、修改、发布所有内容。&lt;/li&gt;&lt;li&gt;Moderator（版主）：可以管理评论和标签，不过不具有其他权限。&lt;/li&gt;&lt;li&gt;Author（作者）：可以管理、修改、发布自己所创建的内容。&lt;/li&gt;&lt;li&gt;Contributor（合作者）：可以管理、修改自己所创建的内容，但是不能发布，只能保存为草稿。&lt;/li&gt;&lt;li&gt;Anonymous（未登录用户）：可以查看前台网站。&lt;/li&gt;&lt;li&gt;Authenticated（已登录用户）：可以查看前台网站。默认的权限和未登录一样，不过我们自己可以有针对性的调整一下。&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;如果我们需要调整某一角色所拥有的权限，只用编辑一下这个角色，并选择可以执行的权限即可。&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0056.jpg" border="0" alt="" width="756" height="638" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;权限介绍&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;权限就是进行某种操作，比如：管理博客，编辑博客文章等等。有些权限是定义是否允许用户执行某一单一操作，但是还有些权限是定义是否允许用户执行某一组操作。也就是说，高级别的权限可以包含低级别的权限。比如：当你拥有管理博客的权限时候，你当然就拥有编辑博客文章的权限。这样的权限就可称做隐含权限（Implied Permissions）。在编辑角色的画面中，我们可以通过查看&amp;#8220;Effective&amp;#8221;列来查看当前角色所拥有的隐含权限。&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/esshs/oc0057.jpg" border="0" alt="" width="675" height="341" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;本文主要介绍了Orchard中内容操作权限控制的基本原理，以及如何使用用户、角色及权限这三者的关系来实现对内容操作权限的控制。通过上文的介绍我们就可以知道，用户和角色都是可以通过后台来管理的，角色和权限也可以通过后台来关联。但是这些权限是如何定义的，在后台中并没有相应的操作。其实这些权限的定义是在模块中实现的，每一个模块都可以定义自己不同的权限。作为模块开发者来说，只用关注什么权限可以执行什么操作就可以了，完全不用考虑当前用户拥有什么角色。换句话说，能否执行某种操作的判断依据是权限，而不是用户和角色，这样的设计能让权限控制更加灵活。关于权限是如何定义的，又如何进行判断的，将在以后的文章中做进一步的介绍。&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;管理用户和角色：&lt;a href="http://www.orchardproject.net/docs/Managing-users-and-roles.ashx" target="_blank"&gt;http://www.orchardproject.net/docs/Managing-users-and-roles.ashx&lt;/a&gt;&lt;/div&gt;&lt;div&gt;理解权限：&lt;a href="http://www.orchardproject.net/docs/Understanding-permissions.ashx" target="_blank"&gt;http://www.orchardproject.net/docs/Understanding-permissions.ashx&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/esshs/aggbug/2142855.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/esshs/archive/2011/08/17/2142855.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
