Compartir a través de


Creación de plantillas de formulario personalizadas

Última modificación: miércoles, 22 de septiembre de 2010

Hace referencia a: SharePoint Foundation 2010

Las plantillas de control de Microsoft ASP.NET que se definen en el archivo DefaultTemplates.ascx en %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES\ determinan el diseño de los formularios de elementos de lista de Microsoft SharePoint Foundation 2010. Estas plantillas pueden anidar controles que, a su vez, usan más plantillas de control para formar la definición del diseño. Los controles pueden contener código HTML y controles web, pero no instrucciones enlazadas a datos con sintaxis <%#...%>. Para invalidar una plantilla de control predeterminada globalmente en un servidor front-end web, puede agregar un archivo .ascx personalizado en el directorio \CONTROLTEMPLATES con un identificador de plantilla de control que coincida con el identificador existente en el archivo DefaultTemplates.ascx. Para obtener información sobre cómo crear un control de usuario n Microsoft Visual Studio, vea el procedimiento para crear un control de usuario para una página de aplicaciones o un elemento web de SharePoint.

Creación de plantillas personalizadas

Además de reemplazar plantillas predeterminadas, puede crear sus propias plantillas de formulario personalizadas y hacer referencia a ellas por tipo de lista o tipo de contenido. Para registrar una plantilla de formulario personalizada por tipo de lista, especifique el nombre de la plantilla de formulario a través del atributo Template en una etiqueta <Form> en el archivo Schema.xml de la definición de lista, como se muestra en el siguiente ejemplo.

<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>

En el siguiente ejemplo se definen dos formularios personalizados adicionales.

<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>

Para registrar una plantilla de formulario personalizada por tipo de contenido, agregue una definición como la siguiente como elemento secundario de la etiqueta <ContentType> en el archivo Elements.xml para la característica.

<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>

En los ejemplos anteriores, "MyCustomForm" es el identificador de una plantilla de control personalizada que va a agregar en el directorio \CONTROLTEMPLATES.

Estructura de plantilla

Las plantillas de control basadas en ASCX agrupan varios controles en una estructura anidada, donde los propios controles constan de plantillas y pueden usarse para ampliar y enriquecer los formularios de elementos de lista.

La plantilla de formulario de biblioteca de documentos que está definida en %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\CONTROLTEMPLATES proporciona un buen ejemplo de una estructura de plantilla de control. En el siguiente ejemplo se muestra la plantilla de control predeterminada definida para el formulario de biblioteca de documentos.

<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>

En este ejemplo, la plantilla de formulario de biblioteca de documentos reúne varios componentes para diseñar la plantilla de formulario completa. Muchos de estos componentes derivan de la clase base Microsoft.SharePoint.WebControls.FormComponent, que a su vez deriva de Microsoft.SharePoint.WebControls.TemplateBasedControl, y significa que los propios componentes pueden convertirse en plantillas.

Sin embargo, la mayor parte del formulario se representa realmente a través de una plantilla independiente que está definida en DefaultTemplates.ascx, cuyo identificador es DocumentLibraryFormCore. Esta plantilla se compone a su vez de varios componentes, incluida una estructura HTML basada en tablas para ayudar a organizar el diseño de página, tal y como se muestra en este ejemplo:

<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>

Un componente clave en la plantilla DocumentLibraryFormCore de este ejemplo es el componente DocumentLibraryFields, que hace referencia al control Microsoft.SharePoint.WebControls.DocumentLibraryFields que deriva de la clase Microsoft.SharePoint.WebControls.ListFieldIterator. El iterador de campo de lista contiene la lógica para diseñar campos en un orden de columnas. Sin embargo, la clase ListFieldIterator solo representa controles si estos no han sido invalidados en las plantillas. Por lo tanto, si agrega un control de campo para un campo específico (por ejemplo, un control que pone el control de campo Título en la parte superior derecha y el control de campo Autor por debajo de esta), el iterador no diseña ese control. También puede elegir especificar su propio iterador de campo de lista, que se deriva de la clase ListFieldIterator, y proporcionar una lógica personalizada para realizar la iteración de campos.

Puede invalidar la plantilla DocumentLibraryForm y especificar una plantilla DocumentLibraryFormCore diferente. A continuación, puede personalizar aún más la plantilla de formulario a partir de ahí, especificar los controles existentes o agregar referencias a otros controles personalizados definidos en un archivo .ascx o en un ensamblado.

Nota importanteImportante

La edición de los archivos Default.ascx predeterminados que SharePoint Foundation instala en servidores front-end web no se admite. Los cambios que realice en los archivos instalados originalmente podrían sobrescribirse al instalar las actualizaciones o Service Pack para SharePoint Foundation, o cuando se actualiza una instalación a la siguiente versión del producto.