martes, 27 de abril de 2010

Problemas con plantillas de página

Hoy, por enésima vez, me he encontrado con un error que aparece en todos los proyectos en los que participo pero que siempre me pilla por sorpresa. La sorpresa viene, sobretodo, porque todo está funcionando perfectamente y, de repente, alguien del equipo me comenta que empieza a obtener errores de este tipo:

Only content controls are allowed directly in a content page that contains Content controls

Progresivamente todos los miembros del equipo empiezan a experimentar el mismo problema hasta que nos afecta a todos. Y sólo entonces, sólo cuando el problema llega a ti te das cuenta de que es el mismo error de siempre. Esta vez voy a escribirlo aquí a ver si me sirve de recordatorio para no volver a llegar al punto de que todo el equipo esté afectado o incluso llegar al punto en que el error no vuelva a repetirse. Vamos a ir paso a paso en la resolución del problema. Lo primero, deshabilitamos los Custom Errors en nuestro web.config para tener más detalles del problema y accedemos al sitio que nos está fallando.

image

Tal y como se muestra en la figura, parece que tenemos un control <asp:content> y a continuación un trozo de html estático. Lo siguiente que se ve en la pantalla es el nombre de la plantilla de página que está fallando, aunque yo lo he recortado para que no se vean nombres reales. En cualquier caso, si abrimos la plantilla que está haciendo saltar el error con SharePoint Designer, por ejemplo, veremos como realmente contiene algo que no debería estar ahí (en verde en el siguiente listado):

<asp:content contentplaceholderid="PlaceHolderMain" runat="server">
    <div id="LeftMenuZone">
        ...
        <div class="clearer"></div>
    </div>
</asp:content><html xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"><head>
<META name="WebPartPageExpansion" content="full">
<!--[if gte mso 9]><xml>
<mso:CustomDocumentProperties>
<mso:PublishingPreviewImage msdt:dt="string">/_catalogs/masterpage/es-ES/Preview Images/welcome.3columns.25-50-25.nomenu.jpg, /_catalogs/masterpage/es-ES/Preview Images/welcome.3columns.25-50-25.nomenu.jpg</mso:PublishingPreviewImage>
<mso:ContentType msdt:dt="string">Diseño de página</mso:ContentType>
<mso:MasterPageDescription msdt:dt="string">Página de bienvenida con tres columnas (25-50-25) sin menú lateral</mso:MasterPageDescription>
<mso:PublishingAssociatedContentType msdt:dt="string">;#Página de bienvenida;#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390064DEA0F50FC8C147B0B6EA0636C4A7D4;#</mso:PublishingAssociatedContentType>
</mso:CustomDocumentProperties>
</xml><![endif]-->
<title>Página de bienvenida de con tres columnas (25-50-25) sin menú lateral</title></head>

Revisas una y otra vez la característica que has creado para desplegar la plantilla y ese código maligno no está por ninguna parte. Entonces, ¿quién está insertando esto? y, lo que es más importante: ¿por qué tanto odio?

Pues aunque parezca mentira, tenemos la solución al problema delante de nuestros ojos desde el principio. Si volvéis a la captura de pantalla del inicio de este artículo veréis como justo antes del código html en cuestión aparece lo siguiente </asp:content>. Pues bien, este detalle a SharePoint no le acaba de gustar a la hora de aprovisionar plantillas de página. Lo que realmente espera encontrar es </asp:Content>. Sí, es case sensitive y ese pequeño detalle puede hacer que todo nuestro sitio empiece a fallar sin contemplaciones. Evidentemente también tenéis que controlar el tag de apertura del control.

Resumiendo, controlad que todos vuestros controles asp:Content estén escritos de la siguiente manera:

<asp:Content ContentPlaceHolderID="PlaceHolderMain" runat="server">
...
</asp:Content>

1 comentarios:

tirafrutas dijo...

Claro que es case sensitive, maruja, si es puro XML.

(Estoy seguro de que en mi próximo proyecto me va a pasar...)