展示如何透過自訂欄位渲染控制項關聯 RenderingTemplate,針對**公告列表**的 **Title 欄位**在 Mobile 的三種表單實現差異化渲染:
Expires) 小於今日 → 標題前綴「OVERDUE: 」。前置需求:已完成「在 Mobile 顯示頁面定制列表項標題」演練。
Tools → External Tools → Add:Title Get Assembly Public Key、Command sn.exe 路徑、Arguments -Tp "$(TargetPath)"、勾選 Use Output window。ItemTitleField,參考 System.Web、System.Web.Mobile、Microsoft.SharePoint。MyCompany.SharePoint.MobileControls.ItemTitleField、Default Namespace MyCompany.SharePoint.MobileControls、簽署強名稱金鑰 ItemTitleField.snk。cd "$(ProjectDir)"
"%programfiles%\microsoft visual studio 8\sdk\v2.0\bin\gacutil" /i "$(TargetPath)" /nologo /f
%systemroot%\system32\iisapp.vbs /a "SharePoint_App_Pool" /r
xcopy *.ascx "C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES\" /y
將 SharePoint_App_Pool 替換為實際 IIS 應用程式池名稱。
Class1.cs → ItemTitleField.cs。using System.Web.UI.MobileControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.MobileControls;
namespace MyCompany.SharePoint.MobileControls
{
public class ItemTitleField : SPMobileBaseTextField
{
// 1. 顯示表單:加入搜尋連結
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.NavigateUrl = "https://search.MSN.com/results.aspx?q=" + title.Replace(' ', '+');
var panel = new Panel { BreakAfter = false };
panel.Controls.Add(this.LabelControl);
panel.Controls.Add(this.LinkControl);
return panel;
}
return null;
}
// 2. 新建表單:預設提示文字
protected override MobileControl CreateControlForNew()
{
MobileControl ctrl = null;
if (this.Field != null)
{
string hint = "Group: Project Name";
if (!this.Page.IsPostBack) this.TextBoxControl.Text = hint;
ctrl = this.TextBoxControl;
}
return ctrl;
}
// 3. 編輯表單:條件式前綴
protected override MobileControl CreateControlForEdit()
{
MobileControl ctrl = null;
if (this.Item != null && this.Field != null)
{
if (this.NeedEllipsisRendering) return this.CreateControlForDisplay();
if (!this.Page.IsPostBack)
{
string editVal = this.Field.GetFieldValueForEdit(this.ItemFieldValue);
string overdue = "OVERDUE: ";
SPListItem item = this.ListItem;
if (item["Expires"] != null)
{
DateTime exp = (DateTime)item["Expires"];
this.TextBoxControl.Text = exp.CompareTo(DateTime.Today) < 0
? overdue + editVal : editVal;
}
}
ctrl = this.TextBoxControl;
}
return ctrl;
}
}
}
關鍵屬性:ItemFieldValue取得目前欄位值;ListItem取得完整SPListItem可存取其他欄位(如Expires);NeedEllipsisRendering判斷是否為省略渲染模式。
Add → New Item → Text File,命名 AnnouncementsItemTitleField.ascx(置專案根目錄,Post-build 會複製)。MyCompany 與 PublicKeyToken(用 External Tool 取得):
<%@ Control Language="C#" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=12.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=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SPMobile" Namespace="Microsoft.SharePoint.MobileControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="CustomMobile" Namespace="MyCompany.SharePoint.MobileControls" Assembly="MyCompany.SharePoint.MobileControls.ItemTitleField, Version=1.0.0.0, Culture=neutral, PublicKeyToken=Token" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<SharePoint:RenderingTemplate RunAt="Server" ID="MobileCustomListField_Announcements_Text_Title">
<Template>
<CustomMobile:ItemTitleField RunAt="Server" />
</Template>
</SharePoint:RenderingTemplate>
Build → Rebuild,組件部署 GAC、.ascx 複製至 CONTROLTEMPLATES、IIS 回收。用 Mobile 裝置/模擬器瀏覽含公告列表的網站:



此演練示範了 Mobile 欄位渲染擴充點的完整開發週期:控制項邏輯 → 模板宣告 → 部署驗證。