Поделиться через


Создание настраиваемых шаблонов форм

Дата последнего изменения: 22 сентября 2010 г.

Применимо к: SharePoint Foundation 2010

Шаблоны элементов управления Microsoft ASP.NET, определенные в файле DefaultTemplates.ascx, находящемся в папке "%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES\", определяют макет форм элементов списка Microsoft SharePoint Foundation 2010. Эти шаблоны могут содержать элементы управления, которые, в свою очередь, используют другие шаблоны элементов управления для определения макета формы. Эти элементы управления могут содержать разметку HTML и веб-элементы управления, но не могут содержать операторы привязки к данным, включая синтаксис <%#...%>. Для глобального переопределения шаблона элемента управления по умолчанию на интерфейсном веб-сервере можно добавить пользовательский ASCX-файл в каталог "\CONTROLTEMPLATES" с идентификатором шаблона элемента управления, соответствующим идентификатору шаблона, существующего в файле DefaultTemplates.ascx. Дополнительные сведения о создании пользовательского элемента управления в Microsoft Visual Studio см. в статье, посвященной созданию пользовательского элемента управления для страницы приложения или веб-страницы SharePoint.

Создание настраиваемых шаблонов

Кроме переопределения шаблонов по умолчанию можно создавать собственные настраиваемые шаблоны форм и ссылаться на них при помощи типа списка или типа контента. Для регистрации настраиваемого шаблона форм по типу списка укажите имя шаблона формы в атрибуте Template в теге <Form> в файле Schema.xml определения списка, как в следующем примере.

<Forms>
  <Form Type="DisplayForm" Url="DispForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> 
  <Form Type="EditForm" Url="EditForm.aspx" SetupPath="pages\form.aspx" Template="MyCustomForm" WebPartZoneID="Main" /> 
  <Form Type="NewForm" Url="NewForm.aspx" SetupPath="pages\form.aspx" Template="MyCustomForm" WebPartZoneID="Main" /> 
</Forms>

В следующем примере определяется две дополнительных пользовательских формы.

<Forms>
  <Form 
    Type="DisplayForm" 
    Url="DispForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" Default="FALSE"/>
  <Form 
    Type="DisplayForm" 
    Url="MyDispForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" 
    UseDefaultListFormWebPart="False" 
    Default="TRUE">
    <WebParts>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="3"><![CDATA[
        <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
          <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly
          <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
          <PageType>PAGE_DISPLAYFORM</PageType>
        </WebPart>]]>
      </AllUsersWebPart>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="1"><![CDATA[
        <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
          <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
          <TypeName>Microsoft.SharePoint.WebPartPages.ListViewWebPart</TypeName>
          <PageType>PAGE_VIEW</PageType>
          <ViewFlags>Hidden ReadOnly Html</ViewFlags>
        </WebPart>]]>
      </AllUsersWebPart>
    </WebParts>
  </Form>
  <Form 
    Type="EditForm" 
    Url="EditForm.aspx" 
    SetupPath="pages\form.aspx" 
    WebPartZoneID="Main" />
  <Form
    Type="EditForm"
    Url="MyEditForm.aspx"
    SetupPath="pages\form.aspx"
    WebPartZoneID="Main"
    Default="TRUE"
    UseDefaultListFormWebPart="False"
    WebPartOrder="1">
    <WebParts>
      <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="1"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>                         
           <TypeName>Microsoft.SharePoint.WebPartPages.ListViewWebPart</TypeName>
           <PageType>PAGE_VIEW</PageType>
           <ViewFlags>Hidden ReadOnly Html</ViewFlags>
         </WebPart>]]>
       </AllUsersWebPart>
       <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="2"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2" xmlns:iwp="https://schemas.microsoft.com/WebPart/v2/Image">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>
           <TypeName>Microsoft.SharePoint.WebPartPages.ImageWebPart</TypeName>
           <FrameType>None</FrameType>
           <Title>Site Image</Title>
           <iwp:ImageLink>/_layouts/images/homepage.gif</iwp:ImageLink>
           <iwp:AlternativeText>Logo</iwp:AlternativeText>
         </WebPart>]]>
       </AllUsersWebPart>
       <AllUsersWebPart WebPartZoneID="Main" WebPartOrder="3"><![CDATA[
         <WebPart xmlns="https://schemas.microsoft.com/WebPart/v2">
           <Assembly>Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c</Assembly>            
           <TypeName>Microsoft.SharePoint.WebPartPages.ListFormWebPart</TypeName>
           <PageType>PAGE_EDITFORM</PageType>
         </WebPart>]]>
       </AllUsersWebPart>
       <View BaseViewID="1" WebPartZoneID="Main" WebPartOrder="4" />
     </WebParts>
   </Form>
   <Form 
     Type="NewForm" 
     Url="NewForm.aspx" 
     SetupPath="pages\form.aspx" 
     WebPartZoneID="Main" />
</Forms>

Для регистрации настраиваемого шаблона форм по типу контента добавьте определение, наподобие приведенного ниже, в качестве дочернего в теге <ContentType> в файле Elements.xml для компонента.

<XmlDocuments>
  <XmlDocument NamespaceURI="https://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
    <FormTemplates  xmlns="https://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
      <Display>MyCustomForm</Display>
      <Edit>MyCustomForm</Edit>
      <New>MyCustomForm</New>
    </FormTemplates>
  </XmlDocument>
</XmlDocuments>

В предыдущих примерах "MyCustomForm" обозначает идентификатор настраиваемого шаблона элементов управления, который добавляется в каталог "\CONTROLTEMPLATES".

Структура шаблона

Шаблоны элементов управления на базе ASCX совмещают в себе множество элементов управления в ячеистой структуре, где сами элементы управления состоят из шаблонов и могут быть использованы для обогащения форм со списками.

Шаблон формы библиотеки документов, заданный в папке "%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES", представляет хороший пример структуры шаблона элементов управления. В следующем примере показан шаблон элементов управления по умолчанию, определенный для формы библиотеки документов.

<SharePoint:RenderingTemplate ID="DocumentLibraryForm" runat="server">
  <Template>
    <SharePoint:InformationBar runat="server"/>
      <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbltop" RightButtonSeparator="&nbsp;" runat="server">
        <Template_RightButtons>
          <SharePoint:SaveButton runat="server"/>
          <SharePoint:GoBackButton runat="server"/>
        </Template_RightButtons>
      </wssuc:ToolBar>
    <SharePoint:FormToolBar runat="server"/>
    <SharePoint:FormComponent TemplateName="DocumentLibraryFormCore" runat="server"/>
  </Template>
</SharePoint:RenderingTemplate>

В этом примере шаблон формы библиотеки документов включает несколько компонентов и образует полный шаблон формы. Многие из этих компонентов являются производными от базового класса Microsoft.SharePoint.WebControls.FormComponent, который, в свою очередь, является производным от Microsoft.SharePoint.WebControls.TemplateBasedControl, что означает, что компоненты сами по себе могут использоваться в качестве шаблонов.

Но большая часть формы отображается при помощи отдельного шаблона, заданного в файле DefaultTemplates.ascx с идентификатором DocumentLibraryFormCore.Этот шаблон состоит из различных компонентов, включая структуру HTML на базе таблиц для облегчения организации макета страницы, как это показано в примере:

<SharePoint:RenderingTemplate ID="DocumentLibraryFormCore" runat="server">
  <Template>
    <TABLE class="ms-formtable" style="margin-top: 8px;" border=0 cellpadding=0 id="formTbl" cellspacing=0 width=100%>
      <SharePoint:ChangeContentType runat="server"/>
      <SharePoint:DocumentLibraryFields runat="server"/>
      <SharePoint:ApprovalStatus runat="server"/>
    </TABLE>

    <SharePoint:WebPartPageMaintenanceMessage runat="server"/>
    <SharePoint:DocumentTransformersInfo runat="server"/>
    <table cellpadding=0 cellspacing=0 width=100%><tr><td class="ms-formline"><IMG SRC="/_layouts/images/blank.gif" width=1 height=1 alt=""></td></tr></table>
    <TABLE cellpadding=0 cellspacing=0 width=100% style="padding-top: 7px"><tr><td width=100%>
      <SharePoint:ItemHiddenVersion runat="server"/>
      <SharePoint:InitContentType runat="server"/>
      <wssuc:ToolBar CssClass="ms-formtoolbar" id="toolBarTbl" RightButtonSeparator="&nbsp;" runat="server">
        <Template_Buttons>
          <SharePoint:CreatedModifiedInfo runat="server"/>
        </Template_Buttons>
        <Template_RightButtons>
          <SharePoint:SaveButton runat="server"/>
          <SharePoint:GoBackButton runat="server"/>
        </Template_RightButtons>
      </wssuc:ToolBar>
    </td></tr></TABLE>
  </Template>
</SharePoint:RenderingTemplate>

Ключевым компонентом шаблона DocumentLibraryFormCore в этом примере является DocumentLibraryFields, который ссылается на элемент управления Microsoft.SharePoint.WebControls.DocumentLibraryFields, производный от класса Microsoft.SharePoint.WebControls.ListFieldIterator. Итератор полей списка содержит логику распределения полей в столбцы. Однако класс ListFieldIterator отображает элементы управления, только если они не были переопределены в шаблонах. Поэтому при добавлении элемента управления полем для конкретного поля (например элемента управления, который помещает элемент управления полем заголовка в правый верхний угол, а элемент управления полем автора под ним) итератор не сможет расположить этот элемент управления в макете. Вместо этого можно указать собственный итератор полей списка, производный от класса ListFieldIterator, и создать собственную настраиваемую логику для итерации полей.

Шаблон DocumentLibraryForm можно переопределить и указать другой шаблон DocumentLibraryFormCore. После этого можно настраивать шаблон формы, указывая уже существующие элементы управления или добавляя ссылки на другие настраиваемые элементы управления, заданные в сборке или в ASCX-файле.

Важное примечаниеВажно!

Редактирование файлов Default.ascx, устанавливаемых SharePoint Foundation по умолчанию на интерфейсных веб-серверах, не поддерживается. Изменения, вносимые в исходно установленные файлы, могут быть перезаписаны при установке обновлений или пакетов обновлений для SharePoint Foundation либо при переходе на новую версию продукта.