本節將對Windows SharePoint Services 3.0 的mobile設備訪問頁面中的字段渲染定制過程做一個概述。詳細的步驟請參考隨後的演練。
前面的Mobile頁面渲染機制一節中我們說過,在頁面裡一個SPMobileListFIEldSelector模板選擇器控件的調用,會導致從該控件開始的鏈式的調用。
基於當前的列表類型和字段(比如本例中的通知和標題),該對象決定了哪個RenderingTemplate會用於在mobile顯示頁面上渲染該字段。
該控件會尋找名為MobileCustomListField_ListTypeID_FieldType_Field的RenderingTemplate。
FieldType 是字段的數據類型。可以在SPFieldType枚舉值中任意取值;比如,Text或Number。他也可以是一個在fldtypes*.xml文件中通過<Field Name="TypeName">元素定義的自定義字段類型。
Field 是字段的內部名稱,比如WorkPhone。如果該字段是作為列表的一部分在Schema.xml列表架構定義文件中指定的,則其內部名稱可以在Field元素的Name屬性中找到。該文件位於目錄: Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\FEATURES\Feature_Folder。如果字段是通過UI添加到列表中的;或者說是通過創建欄頁面,則 Field 是Microsoft.SharePoint.SPField.InternalName的屬性值,可以通過對象模型得到。
注意:
Field 是字段(欄)的內部名稱,不見得與字段的顯示名稱相同。對於用戶通過UI創建的字段來說,其內部名稱是系統根據用戶輸入的顯示名稱(在創建欄頁面的欄名稱 文本框中)生成的。如果該用戶在顯示名詞中包含空格或標點符號,那麼mobile模板渲染機制將無法使用其生成的內部名稱,因此您將無法對這樣的字段進行 渲染的定制。
ListTypeID 可以是當前列表類型的ID號(如105),也可以是SPListTemplateType枚舉的一個值(如Contacts)。有兩種方式來定義一個列表類型ID:
如果列表是作為網站類型的一部分來在Onet.xml站點定義文件中指定的,則 ListTypeID 的值是Onet.xml中List元素的Type屬性值。該文件位於這個目錄下: Local_Drive:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\SITETEMPLATES\Site_Type\xml
如果列表是通過UI添加到網站中的;也就是說,通過新建(列表)頁,則 ListTypeID 為當初用作新列表類型基礎的列表類型的ID。這取決於用戶在創建頁(create.aspx)上的點選,究竟是點擊了哪個列表類型才進到新建頁的。
如果指定的RenderingTemplate元素的ID沒有找到,則他將使用ID為MobileDefaultListFIEld的控件。
已有的RenderingTemplate
當WSS安裝好後,下列的兩個用於字段渲染的RenderingTemplates已經存在於MobileDefaultTemplates.ascx中。
MobileCustomListField_Contacts_Text_WorkPhone
MobileCustomListField_Contacts_Text_HomePhone
MobileCustomListField_Contacts_Text_CellPhone
MobileCustomListField_Contacts_Text_Email
MobileCustomListField_PictureLibrary_Computed_ImageSize
MobileCustomListField_Posts_DateTime_PublishedDate
您不應修改該 MobileDefaultTemplates.ascx 文件。您可以創建一個新的RenderingTemplate元素(在您自己的.ascx文件中),只有使用與已存在的渲染控件相同的ID即可。但是,這麼做將會存在風險,可能會破壞其他部署在WSS中的依賴原來的RenderingTemplate對象的解決方案。
注意:
WSS 3.0自帶的渲染控件會在自定義控件前先載入,所以當存在相同ID的自定義控件時,該控件模板的載入將覆蓋原有的控件。如果有兩個或更多的自定義控件模板 具有相同的ID,則文件名字母順序排列在後面的將覆蓋所有其他的。如果指定的文件中包含兩個或更多的相同ID的渲染模板,則他們都將不被載入。
同時,默認的RenderingTemplate 也就是ID為MobileDefaultListFiled對象也是定義在 MobileDefaultTemplates.ascx 文件中。如果運行時沒有找到為當前列表類型或字段定義的渲染模板,則會使用該模板。如果您新建的 RenderingTemplate 對象使用該 ID 則上面提到的風險也是存在的。
定制mobile列表視圖或窗體中的部分內容
在 Microsoft Visual Studio, Notepad, 或任何文本編輯器中,新建一個用戶控件文件(.ascx),放在路徑 \Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES下。
在文件中添加若干page標記來注冊和引用相應的命名空間。
添加一個渲染控件到 .ascx 文件,采用這樣格式的ID:MobileCustomListFIEld_ListTypeID_FieldType_Field。
其中的ListTypeID,FieldType,Field的取值詳見上文。
在您的渲染模板中可以直接聲明一些可渲染的控件,如Label控件。也可以定義通過繼承SPMobileBaseFieldControl類來定義一個渲染控件。
保存該 .ascx 文件並重新啟動IIS,使更改生效。
示例
下面的RenderingTemplate定義的例子展示了如何創建一個新的標題字段,用於通知列表的列表項。
<SharePoint:RenderingTemplate RunAt="Server" ID="MobileCustomListField_Announcements_Text_Title" >
<Template>
<mobile:Label Text="Title field in Announcements List" RunAt="Server" />
</Template>
</SharePoint:RenderingTemplate>