Si tu solución de SharePoint posee varios webparts, quizá quieras considerar lo que os cuento en breve, de cara a tener una organización de los items del proyecto algo más limpia, y evitar entradas SafeControl innecesarias en el web.config.
Imaginemos que nuestra solución tiene 3 webparts visuales, añadidos a través de la plantilla de Visual Studio. Quedaría algo así:
Para empezar, fijaros en los NameSpaces que tenemos, para cada webpart:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff">namespace</span> Spartans.Sharepoint.OrganizedWebparts.VisualWebPart3 |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> <span style="color: #008000">//...</span> |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> <span style="color: #0000ff">namespace</span> Spartans.Sharepoint.OrganizedWebparts.VisualWebPart2 |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> <span style="color: #008000">//...</span> |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> <span style="color: #0000ff">namespace</span> Spartans.Sharepoint.OrganizedWebparts.VisualWebPart1 |
Un poco “feo” bajo mi punto de vista. Además, si nos vamos a las propiedades de cada webpart, y nos fijamos en la colección de Safe Control Entries:
Vemos que tenemos una entrada SafeControl, y lo mismo para el resto de webparts. Esto hará, que al desplegarlo, tengamos 3 entradas en nuestro Web.Config:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff"><</span><span style="color: #800000">SafeControl</span> <span style="color: #ff0000">Assembly</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=76693daf4f35b7d3"</span> <span style="color: #ff0000">Namespace</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts.VisualWebPart1"</span> <span style="color: #ff0000">TypeName</span><span style="color: #0000ff">="*"</span> <span style="color: #ff0000">Safe</span><span style="color: #0000ff">="True"</span> <span style="color: #ff0000">SafeAgainstScript</span><span style="color: #0000ff">="False"</span> <span style="color: #0000ff">/></span> |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> <span style="color: #0000ff"><</span><span style="color: #800000">SafeControl</span> <span style="color: #ff0000">Assembly</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=76693daf4f35b7d3"</span> <span style="color: #ff0000">Namespace</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts.VisualWebPart2"</span> <span style="color: #ff0000">TypeName</span><span style="color: #0000ff">="*"</span> <span style="color: #ff0000">Safe</span><span style="color: #0000ff">="True"</span> <span style="color: #ff0000">SafeAgainstScript</span><span style="color: #0000ff">="False"</span> <span style="color: #0000ff">/></span> |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> <span style="color: #0000ff"><</span><span style="color: #800000">SafeControl</span> <span style="color: #ff0000">Assembly</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=76693daf4f35b7d3"</span> <span style="color: #ff0000">Namespace</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts.VisualWebPart3"</span> <span style="color: #ff0000">TypeName</span><span style="color: #0000ff">="*"</span> <span style="color: #ff0000">Safe</span><span style="color: #0000ff">="True"</span> <span style="color: #ff0000">SafeAgainstScript</span><span style="color: #0000ff">="False"</span> <span style="color: #0000ff">/></span> |
¿No sería más limpio organizar los Namespaces de forma algo más lógica, y sólo tener una entrada a nivel de web.config, que incluya todos los webparts de nuestra solución?
Vamos a ello !!
Primero de todo, ya que los webparts visuales se basan en controles de usuario, y es posible que nuestra solución tenga otros controles de usuario, vamos a añadir la carpeta mapeada de SharePoint “ControlTemplates”, y creamos una carpeta para todos nuestros controles:
Ahora vamos a mover los controles de usuario que usan los webparts visuales, a esa carpeta. Y ya que estamos, vamos a cambiar el Namespace de los 3 controles, para que todos pertenezcan al mismo Namespace.
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff">namespace</span> Spartans.Sharepoint.OrganizedWebparts.Web.UI |
Recordar que al cambiar el Namespace, también lo tenemos que hacer en el fichero .ascx, en el atributo “Inherits” de la directiva “Control”:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="background-color: #ffff00"><%@ Control </span> |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> Language="C#" |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> AutoEventWireup="true" |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> CodeBehind="VisualWebPart3UserControl.ascx.cs" |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> Inherits="Spartans.Sharepoint.OrganizedWebparts.Web.UI.VisualWebPart3UserControl" %> |
Ahora tenemos que cambiar algunas cosas de los webparts.
Primero de todo, ya que no queremos varias entradas SafeControl en el web.config, las eliminamos de las propiedades.
Lo siguiente es re-apuntar a la nueva ubicación de los controles:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> [ToolboxItemAttribute(<span style="color: #0000ff">false</span>)] |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> VisualWebPart3 : WebPart |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> { |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> <span style="color: #008000">// Visual Studio might automatically update this path when you change the Visual Web Part project item.</span> |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> <span style="color: #0000ff">private</span> <span style="color: #0000ff">const</span> <span style="color: #0000ff">string</span> _ascxPath = <span style="color: #006080">@"~/_CONTROLTEMPLATES/OrganizedControls/VisualWebPart3UserControl.ascx"</span>; |
1 |
<span id="lnum6" style="color: #606060"> 6:</span> |
1 |
<span id="lnum7" style="color: #606060"> 7:</span> <span style="color: #0000ff">protected</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> CreateChildControls() |
1 |
<span id="lnum8" style="color: #606060"> 8:</span> { |
1 |
<span id="lnum9" style="color: #606060"> 9:</span> Control control = Page.LoadControl(_ascxPath); |
1 |
<span id="lnum10" style="color: #606060"> 10:</span> Controls.Add(control); |
1 |
<span id="lnum11" style="color: #606060"> 11:</span> } |
1 |
<span id="lnum12" style="color: #606060"> 12:</span> } |
Y ya que nos ponemos, vamos a cambiar el Namespace de los webparts, y agruparlos en el mismo:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff">namespace</span> Spartans.Sharepoint.OrganizedWebparts.Web.UI.Webparts |
Al cambiar el Namespace, tenemos que actualizar también el fichero .webpart
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff"><?</span><span style="color: #800000">xml</span> <span style="color: #ff0000">version</span><span style="color: #0000ff">="1.0"</span> <span style="color: #ff0000">encoding</span><span style="color: #0000ff">="utf-8"</span>?<span style="color: #0000ff">></span> |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> <span style="color: #0000ff"><</span><span style="color: #800000">webParts</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> <span style="color: #0000ff"><</span><span style="color: #800000">webPart</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://schemas.microsoft.com/WebPart/v3"</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> <span style="color: #0000ff"><</span><span style="color: #800000">metaData</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> <span style="color: #0000ff"><</span><span style="color: #800000">type</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts.Web.UI.Webparts.VisualWebPart1, $SharePoint.Project.AssemblyFullName$"</span> <span style="color: #0000ff">/></span> |
1 |
<span id="lnum6" style="color: #606060"> 6:</span> <span style="color: #0000ff"><</span><span style="color: #800000">importErrorMessage</span><span style="color: #0000ff">></span>$Resources:core,ImportErrorMessage;<span style="color: #0000ff"></</span><span style="color: #800000">importErrorMessage</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum7" style="color: #606060"> 7:</span> <span style="color: #0000ff"></</span><span style="color: #800000">metaData</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum8" style="color: #606060"> 8:</span> <span style="color: #0000ff"><</span><span style="color: #800000">data</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum9" style="color: #606060"> 9:</span> <span style="color: #0000ff"><</span><span style="color: #800000">properties</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum10" style="color: #606060"> 10:</span> <span style="color: #0000ff"><</span><span style="color: #800000">property</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="Title"</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">="string"</span><span style="color: #0000ff">></span>Oraganized webparts VisualWebPart1<span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum11" style="color: #606060"> 11:</span> <span style="color: #0000ff"><</span><span style="color: #800000">property</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">="Description"</span> <span style="color: #ff0000">type</span><span style="color: #0000ff">="string"</span><span style="color: #0000ff">></span>This is webpart 1, from Organized webparts sample<span style="color: #0000ff"></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum12" style="color: #606060"> 12:</span> <span style="color: #0000ff"></</span><span style="color: #800000">properties</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum13" style="color: #606060"> 13:</span> <span style="color: #0000ff"></</span><span style="color: #800000">data</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum14" style="color: #606060"> 14:</span> <span style="color: #0000ff"></</span><span style="color: #800000">webPart</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum15" style="color: #606060"> 15:</span> <span style="color: #0000ff"></</span><span style="color: #800000">webParts</span><span style="color: #0000ff">></span> |
Para acabar, nos falta configurar la solución para que genere una única entrada de SafeControl en el web.config. Para ello, vamos a utilizar el editor del Manifest del paquete de nuestra solución. Este editor, permite combinar el XML que ha autogenerado Visual Studio, con nuestros propios valores insertados en el cuadro de texto.
Añadimos nuestra entrada de SafeControl:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff"><?</span><span style="color: #800000">xml</span> <span style="color: #ff0000">version</span><span style="color: #0000ff">="1.0"</span> <span style="color: #ff0000">encoding</span><span style="color: #0000ff">="utf-8"</span>?<span style="color: #0000ff">></span> |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> <span style="color: #0000ff"><</span><span style="color: #800000">Solution</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://schemas.microsoft.com/sharepoint/"</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> <span style="color: #0000ff"><</span><span style="color: #800000">Assemblies</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> <span style="color: #0000ff"><</span><span style="color: #800000">Assembly</span> <span style="color: #ff0000">Location</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts.dll"</span> <span style="color: #ff0000">DeploymentTarget</span><span style="color: #0000ff">="GlobalAssemblyCache"</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> <span style="color: #0000ff"><</span><span style="color: #800000">SafeControls</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum6" style="color: #606060"> 6:</span> <span style="color: #0000ff"><</span><span style="color: #800000">SafeControl</span> <span style="color: #ff0000">Assembly</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts"</span> <span style="color: #ff0000">Namespace</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts.Web.UI.Webparts"</span> <span style="color: #ff0000">TypeName</span><span style="color: #0000ff">="*"</span> <span style="color: #0000ff">/></span> |
1 |
<span id="lnum7" style="color: #606060"> 7:</span> <span style="color: #0000ff"></</span><span style="color: #800000">SafeControls</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum8" style="color: #606060"> 8:</span> <span style="color: #0000ff"></</span><span style="color: #800000">Assembly</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum9" style="color: #606060"> 9:</span> <span style="color: #0000ff"></</span><span style="color: #800000">Assemblies</span><span style="color: #0000ff">></span> |
1 |
<span id="lnum10" style="color: #606060"> 10:</span> <span style="color: #0000ff"></</span><span style="color: #800000">Solution</span><span style="color: #0000ff">></span> |
Si hacemos el Deploy de la solución, ya vemos que tenemos una única entrada SafeControl en el web.config:
1 |
<span id="lnum1" style="color: #606060"> 1:</span> <span style="color: #0000ff"><</span><span style="color: #800000">SafeControl</span> <span style="color: #ff0000">Assembly</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=76693daf4f35b7d3"</span> |
1 |
<span id="lnum2" style="color: #606060"> 2:</span> <span style="color: #ff0000">Namespace</span><span style="color: #0000ff">="Spartans.Sharepoint.OrganizedWebparts.Web.UI.Webparts"</span> |
1 |
<span id="lnum3" style="color: #606060"> 3:</span> <span style="color: #ff0000">TypeName</span><span style="color: #0000ff">="*"</span> |
1 |
<span id="lnum4" style="color: #606060"> 4:</span> <span style="color: #ff0000">Safe</span><span style="color: #0000ff">="True"</span> |
1 |
<span id="lnum5" style="color: #606060"> 5:</span> <span style="color: #ff0000">SafeAgainstScript</span><span style="color: #0000ff">="False"</span> <span style="color: #0000ff">/></span> |
Al indicar el TypeName como “*”, estamos incluyendo todos los controles de ese Namespace (todos nuestros webparts de la solución).
Si además, vemos nuestra DLL con algún “Decompiler” (Reflector, ILSpy, JustDecompile…), vamos que nuestro namespaces, webparts y controls, están ordenaditos:
Si tenemos una solución con mucho desarrollo personalizado, seguro que agradecemos este orden.
Espero que os sirva.
Saludos!!
30
Deja un comentario