Patrones de representación de campos personalizados
Dispone de una gran variedad de opciones para tener un control más preciso de cómo se representan los campos personalizados. En este tema, se describen algunos patrones habituales y se indica cómo puede modificarlos para que se ajusten a sus necesidades.
Nota
Este tema trata acerca de la representación de campos personalizados y sus valores. No trata acerca de la representación de las propiedades de variables de los tipos de campos personalizados de las páginas Nueva columna de sitio, Cambiar columna de sitio, Crear columna y Cambiar columna. Para obtener información acerca de cómo representar las propiedades de los campos de variables de los tipos de campos personalizados, consulte Representación de propiedades de tipo de campo personalizado.
Uso exclusivo de RenderPatterns
En la forma más sencilla de representar un tipo de campo personalizado no se usan controles de representación de campos ni plantillas de representación de campos (consulte la información al respecto más adelante). En su lugar, la representación de campos en todos los modos de control (creación, edición y presentación), así como en las vistas de lista, se lleva a cabo completamente por medio de varios RenderPattern definidos en una definición de campo. Pero este método limita la lógica de validación a lo que se puede realizar por medio de scripts. Por este motivo, probablemente verá que puede usar RenderPatterns sólo para la representación en vistas de lista y en el modo de presentación, donde la validación no es un problema.
En los modos de edición y creación, normalmente deberá crear un control de representación de campos y al menos una plantilla de representación de campos.
El sistema de plantillas y controles de representación
Cada control de representación de campos tiene al menos una plantilla de representación de campos asociada. La asociación se realiza haciendo que el control de representación de campos tenga, en una de sus propiedades, una referencia al identificador de la plantilla de representación de campos. En tiempo de representación, Windows SharePoint Services 3.0 busca la plantilla necesaria realizando una búsqueda de los identificadores de todas las plantillas de representación declaradas en archivos .ascx en C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\CONTROLTEMPLATES
(todos ellos se cargan al iniciar la aplicación web). Con frecuencia, el método CreateChildControls del control de representación realiza una última optimización de la representación del campo, pero la mayoría del trabajo de representación se realiza mediante la plantilla.
El patrón más habitual
El patrón de configuración de representación de campos que usará con más frecuencia a medida que desarrolle tipos de campos personalizados tiene las características siguientes:
La definición del campo personalizado (en el archivo fldtypes*.xml) contiene un tipo DisplayPattern de RenderPattern que representa el campo en vistas de lista y en el modo de presentación.
Existe un control de representación que está asociado únicamente con una plantilla de representación. El control usa su propiedad TemplateName para especificar el identificador de la plantilla.
Esta única plantilla se usa para proporcionar la mayor parte de la representación del campo en los modos de edición y creación.
El método CreateChildControls del control de representación asigna valores predeterminados a los controles secundarios del control de representación en el modo de creación. Asigna los valores actuales del campo a los controles secundarios en el modo de edición. No realiza ninguna acción en el modo de presentación. También podría hacer otras tareas de representación de "toque final", como por ejemplo la asignación de una clase CSS a un control Label secundario.
La lógica de validación se implementa mediante los miembros Validate, IsValid y ErrorMessage del control de representación de campos y mediante el método GetValidatedString del tipo de campo subyacente. (CreateChildControls puede llamar a Validate.)
Patrones más complejos
En esta sección se describen algunas de las formas en que se puede desviar del patrón estándar cuando el tipo de campo personalizado lo requiera.
Uso de una plantilla en el modo de presentación
En ciertas ocasiones puede resultar preferible usar una plantilla de representación de campos, en lugar de un RenderPattern, incluso para el modo de presentación. Por ejemplo, puede haber muchos tipos de campos personalizados con un aspecto prácticamente idéntico en el modo de presentación. Es difícil volver a usar un RenderPattern en muchos tipos de campos, excepto en lo que concierne a copiar y pegar desde un fldtypes*.xml a otro (o dentro de un archivo de este tipo). Sin embargo, si ha usado este método y tiene que realizar un cambio en el RenderPattern, tendrá que buscar todos los lugares donde lo ha copiado. Por este motivo, es posible que prefiera usar una plantilla de representación de campos a la que se puedan hacer referencia muchos controles de representación diferentes.
No es probable que se pueda usar la misma plantilla para los tres modos de control. Los modos de edición y creación requieren controles interactivos, como cuadros de texto editables, casillas y controles de lista desplegable. No obstante, normalmente el modo de presentación sólo requiere controles Label o Literal u otros controles de presentación estática. Por esta razón, es probable que deba crear una plantilla de representación diferente para el modo de presentación. Puede especificar esta plantilla (mediante un identificador) en la propiedad DisplayTemplateName.
La plantilla de representación que realmente se usa para representar el campo en cualquier contexto es la devuelta por la propiedad ControlTemplate del control de representación. Su descriptor de acceso get selecciona una de las plantillas de representación asociadas con el control de representación, mediante criterios de decisión como los siguientes:
El contexto HTTP actual
El modo de control
Si el campo es obligatorio
Si el campo, en caso de ser numérico, debe representarse en forma de porcentaje
Si el elemento de lista es una carpeta o no
Puede reemplazar esta propiedad y hacer que el descriptor de acceso get compruebe el modo de control y devuelva DisplayTemplate cuando se use el modo de presentación. (A menos que se haya establecido de forma explícita en alguna otra plantilla, DisplayTemplate devuelve la plantilla identificada por DisplayTemplateName.) A menos que necesite una lógica de decisión diferente en el descriptor de acceso get para ControlTemplate, basta con que haga que llame al descriptor de acceso get de la propiedad base en el modo de creación o edición.
Nota
Un medio alternativo de designar una plantilla de representación en modo de presentación consiste en que el método CreateChildControls asigne DisplayTemplateName a TemplateName en modo de presentación. (A menos que se haya reemplazado, ControlTemplate devuelve Template y, a menos que el descriptor de acceso get de éste último haya sido reemplazado, devuelve la plantilla identificada por TemplateName.) Un posible punto débil de este enfoque es que el código no se ejecuta en un contexto en el que el campo no se se representa, como por ejemplo cuando, para las depuraciones, se comprueba el valor de ControlTemplate en el modelo de objetos.
Otras situaciones que requieren varias plantillas de representación
Además de Template, TemplateName, DisplayTemplate y DisplayTemplateName; también puede trabajar con AlternateTemplate, AlternateTemplateName.
Use una plantilla alternativa para representar el campo personalizado en cualquier contexto de página en que la plantilla principal no cumpla con los requisitos. A continuación, se enumeran algunos ejemplos:
Si el campo es necesario en algunas listas, pero no en otras, puede usar una plantilla alternativa idéntica a la principal excepto en el hecho de que agrega un indicador; por ejemplo, un asterisco de color rojo, que indica que el campo es obligatorio en listas específicas. A continuación, haga que el descriptor de acceso get de ControlTemplate compruebe la propiedad Required del campo subyacente y devuelva Template o AlternateTemplate según corresponda.
Si tiene previsto usar muchos tipos de campos personalizados que se representarán de forma prácticamente idéntica, puede conseguir una mejor reutilización del código mediante la creación de plantillas independientes que se usarán en los modos de creación y edición. En el modo de creación, se asignarían valores predeterminados a objetos secundarios y en el modo de edición se asignarían los valores actuales. De este modo, podría evitar la repetición de la lógica de asignación en el método CreateChildControls de cada una de las clases de tipos de campos personalizados. De nuevo, el descriptor de acceso get de ControlTemplate determinaría la plantilla que se usaría en función del modo de control.
El uso de una plantilla alternativa también puede ser útil cuando es necesario representar el campo de un modo especial en sitios web, colecciones de sitios o aplicaciones web concretos. Considere, por ejemplo, un sitio web diseñado para personas con una discapacidad visual, como el daltonismo. El descriptor de acceso get de ControlTemplate puede examinar el valor de RenderContext para ver si es necesario usar una plantilla especial y devolver la plantilla adecuada.
Para tipos de campos personalizados que se heredan de SPFieldNumber y que, en ocasiones, deben representarse en forma de porcentajes, si se dispone de dos plantillas de representación diferentes es posible ahorrar un gran cantidad de tiempo de desarrollo. Reemplace el descriptor de acceso get de ControlTemplate para responder al valor de la propiedad Microsoft.SharePoint.SPFieldNumber.ShowAsPercentage.
Adición de más asociaciones de plantillas
Puede, por supuesto, agregar más asociaciones de plantillas de representación al control de representación de campos derivado de BaseFieldControl. Se recomienda seguir el patrón siguiente:
Cree un nuevo campo privado con nombre del tipo ITemplate.
Cree una nueva propiedad pública en forma de contenedor para el campo privado y asígnele un nombre, como por ejemplo circumstanceTemplate, donde circumstance identifica la circunstancia en que prevé que se use la plantilla.
Cree otra propiedad pública que devuelva un String y denomínela circumstanceTemplateName.
El descriptor de acceso get de circumstanceTemplate debería devolver el campo privado sólo si éste último no es null. De lo contrario, debería devolver el elemento ITemplate al que circumstanceTemplateName asigna el nombre. Use el método GetTemplateByName para llevar a cabo esta acción.
Reemplace el descriptor de acceso get de ControlTemplate para devolver la plantilla circumstanceTemplate siempre que circumstance sea true.
Uso de controles web personalizados como plantillas
El control de representación de campos personalizados también hereda dos propiedades ITemplate especiales:
CustomTemplate y CustomAlternateTemplate. Estas dos propiedades se marcan con el atributo [PersistenceMode(PersistenceMode.InnerProperty)]
. Esto significa que los objetos ITemplate que devuelven se compilan y almacenan en el control de representación de campos en forma de etiquetas anidadas. El uso de plantillas compiladas previamente presenta varias ventajas: por ejemplo, se pueden agregar a una página en un diseñador visual, como Microsoft Office SharePoint Designer 2007 o Microsoft Visual Studio 2005, mediante el procedimiento de arrastrar y colocar desde el cuadro de herramientas del diseñador. Sin embargo, también presenta desventajas. Para obtener más información acerca de los controles de usuario web y los controles web personalizados, consulte Web User Controls and Web Custom Controls y PersistenceModeAttribute.
Diferencias entre la representación de campos para dispositivos móviles y la representación de campos para equipos
En Windows SharePoint Services 3.0, la representación de campos con controles de representación de campos personalizados para dispositivos móviles es similar a la representación de campos con controles de representación de campos personalizados para equipos. No obstante, tenga en cuenta las diferencias siguientes:
Las páginas móviles son un conjunto totalmente diferente de páginas con respecto a las páginas normales y hacen referencia a un conjunto diferente de plantillas RenderingTemplate.
Las plantillas RenderingTemplate móviles se declaran en
MobileDefaultTemplates.ascx
, no enDefaultTemplates.ascx
.Los controles de representación de campos móviles tienen su propio espacio de nombres, Microsoft.SharePoint.MobileControls (en lugar de Microsoft.SharePoint.WebControls), y se derivan de clases de System.Web.UI.MobileControls de ASP.NET en lugar de System.Web.UI.WebControls.
La jerarquía de herencia para controles de representación de campos móviles es algo diferente de la de los controles de representación de campos habituales. Por ejemplo, las funciones de TemplateBasedControl y FormComponent en la representación de campos habitual se combinan en la clase SPMobileComponent.
Los controles de representación de campos personalizados que cree para contextos móviles se basan más en el método CreateChildControls del control para representar un campo y, en consecuencia, menos en la plantilla de representación (en la que se basan los controles de representación de campos personalizados que se crean para exploradores de equipos). Además, en los controles de representación móviles personalizados no se suele reemplazar el método CreateChildControls en sí. En su lugar, se suelen reemplazar uno o varios de los otros cuatro métodos a los que se llama mediante CreateChildControls: CreateControlForDisplay, CreateControlForEdit, CreateControlForNew y CreateControlForView. Para obtener más información acerca de los controles de representación de páginas móviles y de campos personalizados, consulte Sistema de representación de páginas móviles y Tutorial: creación de un control de representación de campos personalizado para páginas móviles.
Vea también
Otros recursos
Tipos de campos personalizados
Clases de campos personalizados
Validación de datos de campos personalizados
Clases de valores de campo personalizados
Definición de tipo de campo personalizado
Representación de propiedades de tipo de campo personalizado
Controles del editor para propiedades de tipo de campo
Controles de representación de campos
Plantillas de representación de campos
Tutorial: Crear un tipo de campo personalizado
Sistema de representación de páginas móviles
Tutorial: creación de un control de representación de campos personalizado para páginas móviles