演练:为移动页面创建自定义字段呈现控件
上次修改时间: 2011年2月2日
适用范围: SharePoint Foundation 2010
本演练介绍如何通过实现自定义字段呈现控件和RenderingTemplate 对象来自定义移动网页上的字段呈现方式。此示例过程说明如何在"显示"项目、"新建"项目和"编辑"项目移动网页上自定义 Announcements 列表中某个项目的 Title 字段。这三种网页的自定义方式各不相同:
"显示"表单 — 添加一个搜索链接,用户可以通过此链接使用 Bing 在 Internet 上搜索公告标题。
"编辑"表单 — 当 Expires 列的值小于当前日期时添加默认文本。
"新建"表单 — 添加默认文本以便为用户显示值的特定格式。
有关在移动页面上自定义字段的步骤的概述,请参阅如何:自定义移动页上的字段呈现。
先决条件
至少执行以下一项操作:
创建一个工具,以获取程序集的全名,并将其添加到 Microsoft Visual Studio"工具"菜单中。有关详细信息,请参阅如何:创建用于获取程序集全名的工具。
创建一个工具,以获取程序集的公钥,并将其添加到 Visual Studio"工具"菜单中。有关详细信息,请参阅如何:创建用于获取程序集公钥的工具。
建议:完成演练:自定义移动表单上的项目标题中介绍的演练。
设置自定义字段项目
在 Visual Studio 中,创建一个"空白 SharePoint 项目"。使其成为服务器场解决方案,而不是沙盒解决方案;并将其命名为 MobileItemTitleField。
在"解决方案资源管理器"中,右键单击项目名称,然后选择"属性"。
在"属性"对话框的"应用程序"选项卡上,输入 Contoso.SharePoint.MobileControls.ItemTitleField 作为"程序集名称",并输入 Contoso.SharePoint.MobileControls 作为"默认命名空间"。将"目标框架"设置为 .NET Framework 3.5。
如果 Visual Studio"标准菜单"上的"解决方案平台"框未显示"任何 CPU"或"x64",请打开"生成"选项卡,然后将"平台目标"设置为"任何 CPU"或"x64"。有关进行选择的信息,请参阅如何:设置正确的目标框架和 CPU。
在工具栏上单击"保存所有文件"按钮。
右键单击"解决方案资源管理器"中的项目名称,指向"添加",然后选择"新建项"。
在"添加新项"对话框中,选择"Visual C#",然后选择"已安装的模板"树中的"代码"。
在"模板"框中,选择"类",然后在"名称"框中键入 ItemTitleField.cs。单击"添加"。
在"解决方案资源管理器"中,右键单击"引用"节点,然后单击"添加引用"。在按下 Ctrl 键的同时,选择"添加引用"对话框中".NET"选项卡上的"System.Web"和"System.Web.Mobile"。单击"确定"。
在"解决方案资源管理器"中,右键单击项目名称,指向"添加",然后选择"SharePoint 映射文件夹"。
使用打开的树控件将该文件夹映射到 TEMPLATE\ControlTemplates,然后单击"确定"。
在"解决方案资源管理器"中,右键单击新 ControlTemplates 文件夹(而不是项目名称),指向"添加",然后选择"新建项"。
在"添加新项"对话框中,选择"已安装的模板"树中的"SharePoint",再选择"2010"。
在"模板"框中,选择一个 SharePoint"用户控件",并将 .ascx 文件命名为 AnnouncementsItemTitleField.ascx。单击"添加"。Visual Studio 会自动将该文件添加到 SharePoint 解决方案清单中,并将其设置为部署到 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates。此时,它还会将程序集添加到清单中,并将其设置为部署到常规程序集缓存。
提示 不要通过右键单击"解决方案资源管理器"中的项目名称 来添加"用户控件"。当通过这种方式添加"用户控件"时,Visual Studio 会将其放在 TEMPLATE\ControlTemplates 的子文件夹中,如果该控件未移动,Visual Studio 会将其部署到 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\ControlTemplates 的相应子文件夹中。不会加载子文件夹中的移动呈现模板。
删除在 AnnouncementsItemTitleField.ascx 文件下自动创建的 AnnouncementsItemTitleField.ascx.cs 和 AnnouncementsItemTitleField.ascx.designer.cs 文件。此项目不需要它们。AnnouncementsItemTitleField.ascx 的默认内容指的就是您刚才删除的 AnnouncementsItemTitleField.ascx.cs 文件,因此编译器将向您发出有关缺失文件的警告。可忽略以下警告:本主题后面步骤中的默认内容将发生更改。
创建呈现控件
打开项目的 ItemTitleField.cs 文件(如果此文件尚未打开),并添加以下 using 语句:
using System.Web.UI.MobileControls; using Microsoft.SharePoint; using Microsoft.SharePoint.MobileControls;
如果 ItemTitleField 声明中尚不存在 public 访问修饰符,请进行添加,并修改声明,以指定它继承自 SPMobileBaseTextField。
public class ItemTitleField : SPMobileBaseTextField { }
添加 CreateControlForDisplay() 方法的以下重写方法。
protected override MobileControl CreateControlForDisplay() { string title = Convert.ToString(this.ItemFieldValue); if (!String.IsNullOrEmpty(title)) { this.LabelControl.BreakAfter = false; this.LabelControl.Text = title + " "; this.LinkControl.BreakAfter = false; this.LinkControl.Text = "Search"; this.LinkControl.href = "https://www.bing.com/search?q=" + title.Replace(' ', '+'); Panel panel = new Panel(); panel.BreakAfter = false; panel.Controls.Add(this.LabelControl); panel.Controls.Add(this.LinkControl); return panel; } return null; }
请注意,此方法首先会获取当前列表项的"标题"字段的当前值。当前值存储在 ItemFieldValue 属性中。
添加 CreateControlForNew 方法的以下重写方法。
protected override MobileControl CreateControlForNew() { MobileControl myNewControl = null; if (this.Field != null) { string text = "Group: Project Name"; if (!this.Page.IsPostBack) { this.TextBoxControl.Text = text; } myNewControl = this.TextBoxControl; } return myNewControl; }
添加 CreateControlForEdit 方法的以下重写方法。
protected override MobileControl CreateControlForEdit() { MobileControl myEditControl = null; if (this.Item != null && this.Field != null) { if (this.NeedEllipsisRendering) { myEditControl = this.CreateControlForDisplay(); } else { if (!this.Page.IsPostBack) { string strEdit = this.Field.GetFieldValueForEdit(this.ItemFieldValue); string overDue = "OVERDUE: "; SPListItem item = this.ListItem; if (item["Expires"] != null) { System.DateTime date = (DateTime)item["Expires"]; if (date.CompareTo(System.DateTime.Today) < 0) { this.TextBoxControl.Text = overDue + strEdit; } else { this.TextBoxControl.Text = strEdit; } } } myEditControl = this.TextBoxControl; } } return myEditControl; }
创建呈现模板
打开 AnnouncementsItemTitleField.ascx 文件,并将整个指令部分替换为以下标记。
<%@ Register TagPrefix="GroupBoardMobile" Namespace="Microsoft.SharePoint.Applications.GroupBoard.MobileControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Control Language="C#" %> <%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %> <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register TagPrefix="SPMobile" Namespace="Microsoft.SharePoint.MobileControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register TagPrefix="WPMobile" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
使用以下代码添加其他标记前缀注册项。
<%@ Register TagPrefix="Contoso" Namespace="Contoso.SharePoint.MobileControls" Assembly="$SharePoint.Project.AssemblyFullName$" %>
在生成项目时,Visual Studio 标记 $SharePoint.Project.AssemblyFullName$ 将替换为由四个部分组成的程序集名称。
为 Microsoft.SharePoint 命名空间添加 Import 指令。
<%@ Import Namespace="Microsoft.SharePoint" %>
在指令下,添加一个 RenderingTemplate 并为其分配运行时要查找的 ID:MobileCustomListField_Announcements_Text_Title。
<SharePoint:RenderingTemplate RunAt="Server" ID="MobileCustomListField_Announcements_Text_Title" > </SharePoint:RenderingTemplate>
在 RenderingTemplate 元素中,定义将您的自定义 ItemTitleField 对象用作子控件的 Template。
<Template> <Contoso:ItemTitleField RunAt="Server" /> </Template>
注意,此文件与在演练:自定义移动表单上的项目标题中创建的文件相似。二者之间的区别是:
添加了新的 Register 指令以注册"Contoso"标记前缀。
添加了导入 Microsoft.SharePoint 命名空间的行。
以下行位于演练:自定义移动表单上的项目标题中:
<mobile:Label Text="Title field in Announcements List" RunAt="Server" />
在此主题示例代码中该行替换为以下行
<Contoso:ItemTitleField RunAt="Server" />
这使呈现模板能够调用您在本演练的前面部分中创建的字段呈现控件。
在"生成"菜单上选择"部署解决方案"。这将自动重新生成程序集,保存 .ascx 文件,将该程序集部署到全局程序集缓存,将 .ascx 文件部署到 %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATES\ControlTemplates,并回收 Web 应用程序。
测试呈现控件
利用移动设备或仿真器导航到包含"通知"列表的 Web 应用程序中的网站。导航到"通知"列表。单击"新建项"链接。应显示如图 1 所示的内容。
图 1. 为"新建"表单中的"标题"字段指定的默认文本
创建一个新项并为其提供表示过去 某一日期的"过期"值。单击"保存"。这会将您带回列表视图。单击以显示该新项。应显示如图 2 所示的内容。请注意添加到标题末尾的"搜索"链接。
图 2. 添加到"显示"表单的搜索链接
单击"编辑"链接。应显示如图 3 所示的内容。请注意添加到当前标题的"OVERDUE"。
图 3. "编辑"表单的"标题"字段中的文本的条件呈现