<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results for 'app:weblogs' matching tags 'ASP.NET 2.0', 'XPath', 'SharePoint 2007', and 'Windows SharePoint Services'</title><link>http://msmvps.com/search/SearchResults.aspx?q=app:weblogs&amp;tag=ASP.NET+2.0,XPath,SharePoint+2007,Windows+SharePoint+Services&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tags 'ASP.NET 2.0', 'XPath', 'SharePoint 2007', and 'Windows SharePoint Services'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Como validar campos en formularios de listas personalizadas de SharePoint con SharePoint Designer</title><link>http://msmvps.com/blogs/haarongonzalez/archive/2011/06/15/como-validar-campos-en-formularios-de-listas-personalizadas-de-sharepoint-con-sharepoint-designer.aspx</link><pubDate>Wed, 15 Jun 2011 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1794775</guid><dc:creator>haaron</dc:creator><description>&lt;p&gt;Lo único que puedo decir es que aquellos pequeños y finos detalles dejan un sabor mucho más agradable a la experiencia. &lt;/p&gt;  &lt;p&gt;Durante un pasado servicio de soporte se solicitó un requerimiento de validar que el campo fecha de una lista personalizada, no permitiera ingresar fechas mayores o iguales al día de hoy. Sin duda, de primera mano y como todo un programador piensas en construir un Custom Field que contenga la funcionalidad solicitada, sin embargo, todas las implicaciones y costo de desarrollar, probar, implementar y mantener una funcionalidad como tal no se justifica como para esta necesidad solicitada y el sentido de urgencia. &lt;/p&gt;  &lt;p&gt;El folclórico y temperamental SharePoint Desginer 2007 a.k.a “&lt;strong&gt;SPD&lt;/strong&gt;” hace su aparición como una alternativa para realizar la validación solicitada. &lt;/p&gt;  &lt;p&gt;Básicamente la solución será:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Copiar y pegar la página NewForm.aspx de la lista en cuestión con el nombre de NewFormEnhancement.aspx &lt;/li&gt;    &lt;li&gt;Abrir la página y poner invisible el primer WebPart &lt;/li&gt;    &lt;li&gt;Agregar un Custom List Form de tipo New para la lista en cuestión &lt;/li&gt;    &lt;li&gt;Agregar validadores a field donde requerimos la funcionalidad &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;b&gt;1. Copiar y pegar la página NewForm.aspx de la lista en cuestión con el nombre de NewFormEnhanced.aspx &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/6318.image_5F00_1F26DD4A.png"&gt;&lt;img style="border-right-width:0px;margin:15px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" align="right" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/3276.image_5F00_thumb_5F00_6C56D6D5.png" width="210" height="240" /&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Cargamos el sitio en cuestión usando &lt;strong&gt;SPD&lt;/strong&gt;, asegúrate de firmarte al sitio en cuestión&amp;#160; con una cuenta que por lo menos el permiso de &lt;strong&gt;Site Collection owner&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Cuando cargas el sitio podrás ver en forma de árbol el contenido. &lt;/li&gt;    &lt;li&gt;Expande la carpeta &lt;strong&gt;Lists&lt;/strong&gt; y de los elementos mostrados expandes la lista que deseas personalizar. Observa que se tienen un conjunto de archivos .aspx, selecciona &lt;strong&gt;NewForm.aspx&lt;/strong&gt; y da clic derecho, copia la página y ahí mismo pegas con el nombre de &lt;strong&gt;NewFormEnhancements.aspx&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;2. &lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/1256.image_5F00_4FD9E4F5.png"&gt;&lt;img style="border-right-width:0px;margin:15px 35px 15px 15px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" align="left" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/7838.image_5F00_thumb_5F00_0B2D4AB4.png" width="244" height="162" /&gt;&lt;/a&gt; &lt;/b&gt;&lt;b&gt;Abrir la página y poner invisible el primer WebPart&lt;/b&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Das doble clic sobre &lt;strong&gt;NewFormEnhanced.aspx&lt;/strong&gt;. &lt;strong&gt;SPD&lt;/strong&gt; carga la página para poder ser editada. &lt;/li&gt;    &lt;li&gt;Da clic sobre el único &lt;strong&gt;WebPart&lt;/strong&gt; en la página y da clic derecho para elegir la opción de &lt;strong&gt;WebPart Properties&lt;/strong&gt;. &lt;strong&gt;WebPart Properties&lt;/strong&gt; carga el panel de propiedades correspondiente. &lt;/li&gt;    &lt;li&gt;Expande la sección de &lt;strong&gt;Layout&lt;/strong&gt; y da clic sobre el cuadro de verificación &lt;strong&gt;Hidden&lt;/strong&gt;. Esto hace que en la página en cuestión el &lt;strong&gt;WebPart&lt;/strong&gt; pre determinado no este visible. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;3. &lt;/b&gt;&lt;b&gt;Agregar un Custom List Form de tipo New para la lista en cuestión&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/5381.image_5F00_6EB058D3.png"&gt;&lt;img style="border-right-width:0px;margin:15px 15px 15px 25px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" align="right" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/5126.image_5F00_thumb_5F00_352D48DC.png" width="434" height="272" /&gt;&lt;/a&gt;En el código Markup de la página en cuestión buscamos el lugar donde se encuentra&amp;#160; &lt;strong&gt;&amp;lt;/WebPartPages:        &lt;br /&gt;ListFormWebPart&amp;gt;         &lt;br /&gt;&amp;lt;/ZoneTemplate&amp;gt;         &lt;br /&gt;&amp;lt;/WebPartPages:         &lt;br /&gt;WebPartZone&amp;gt;&lt;/strong&gt; y justo debajo posicionamos nuestro cursor. &lt;/li&gt;    &lt;li&gt;Seleccionamos del menú &lt;strong&gt;Insert&lt;/strong&gt; la opción &lt;strong&gt;SharePoint Controls&lt;/strong&gt; y &lt;strong&gt;Custom List Form&lt;/strong&gt;. Esto carga una ventana de dialogo que nos permite seleccionar el tipo de &lt;strong&gt;WebPart&lt;/strong&gt; que deseamos insertar sobre nuestra página personalizada. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/6708.image_5F00_4DBCE62C.png"&gt;&lt;img style="border-right-width:0px;margin:15px 35px 15px 15px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" align="left" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/2117.image_5F00_thumb_5F00_292B58A8.png" width="240" height="230" /&gt;&lt;/a&gt; Configuramos el tipo de forma de captura que será aprovisionado por esta ventana de dialogo. Básicamente elegimos la lista de la cual necesitamos una instancia del formulario de captura y muy importante es el tipo de formulario de captura que requerimos como la forma de nuevo elemento, forma de modificación de un elemento o forma de visualización de un elemento. Elegimos &lt;strong&gt;New Item form&lt;/strong&gt;, damos clic en Ok y esto genera una nueva instancia de la forma de captura para nuevos elementos de la lista que elegimos. Esta forma de captura es aprovisionada en código Markup de tipo &lt;strong&gt;WebPartPages:DataFormWebPart&lt;/strong&gt; el cual expone los fields que el formulario tiene y el layout HTML donde estos fields son ubicados en la forma, esto nos da grandes posibilidades de personalización visual. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;b&gt;4. &lt;/b&gt;&lt;b&gt;Agregar validadores a field donde requerimos la funcionalidad&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/6562.image_5F00_68890C38.png"&gt;&lt;img style="border-right-width:0px;margin:15px 15px 25px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" align="right" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/2451.image_5F00_thumb_5F00_2ED64C81.png" width="468" height="291" /&gt;&lt;/a&gt; Buscamos el field de tipo fecha que deseamos validar. &lt;/li&gt;    &lt;li&gt;Nos aseguramos de modificar el tipo de control que se tiene configurado. Simplemente seleccionamos el control en cuestión y damos clic derecho sobre él, elegimos la opción de &lt;strong&gt;Show common control task&lt;/strong&gt; cargando con ello una sección donde podemos elegir el tipo de control. Como podemos ver seguramente tenemos la opción de&lt;strong&gt; Form Field&lt;/strong&gt; como &lt;strong&gt;Format As&lt;/strong&gt;, damos clic sobre el cuadro de selección y elegimos &lt;strong&gt;Date Picker&lt;/strong&gt;. Esto hace una especie de cambio en el control. &lt;/li&gt;    &lt;li&gt;Damos clic derecho Properties sobre el control y buscamos la propiedad &lt;strong&gt;ID&lt;/strong&gt; en mi caso fue “ff6_1”. Este ID es muy importante ya que con el podremos asociarlos a otros controles del lado servidor como TextBox, Validation Controls,. etc. Lo único importante que se debe de contemplar es que cuando utilizamos los controles de ASP.NET o nativos de SharePoint, estos hacen referencia al control no con el &lt;strong&gt;ID&lt;/strong&gt; como tal, sino con el siguiente patrón “&lt;strong&gt;ID$IDTipoDeDato&lt;/strong&gt;” en otras palabras &lt;strong&gt;“ff6_1$ ff6_1Date&lt;/strong&gt;”. &lt;/li&gt;    &lt;li&gt;Dentro del código Markup buscamos la terminación de la declaración del control Date Picker &lt;strong&gt;“&amp;lt;/SharePoint:DateTimeControl&lt;/strong&gt;&amp;gt;” y justo abajo pegamos el siguiente código: &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;&amp;lt;SharePoint:InputFormCustomValidator &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;ClientValidationFunction=&amp;quot;IsValidDate&amp;quot; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;ID=&amp;quot;custvDueDate&amp;quot; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;runat=&amp;quot;server&amp;quot; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;Display=&amp;quot;Dynamic&amp;quot; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;SetFocusOnError=&amp;quot;false&amp;quot;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;ControlToValidate=&amp;quot;ff6_1$ff6_1Date&amp;quot; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;BreakBefore=&amp;quot;true&amp;quot; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;BreakAfter=&amp;quot;false&amp;quot; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;ErrorMessage=&amp;quot;Date must be grater than today&amp;quot; /&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Como se puede observar, tenemos controles del lado servidor específicos de SharePoint. Estos controles heredan de los controles de validación de ASP.NET y agregan otro comportamiento adicional muy similar a los de ASP.NET pero especial para SharePoint. Mediante las directivas pre definidas en la página podemos acceder a ellos.&amp;#160; &lt;a href="http://karinebosch.wordpress.com/"&gt;Karine Bosch&lt;/a&gt; explica &lt;a href="http://karinebosch.wordpress.com/sharepoint-controls/sharepoint-validation-controls/"&gt;aquí &lt;/a&gt;cada uno de estos controles y lo hace muy bien. Favor de ver este post antes de continuar.&lt;/p&gt;  &lt;p&gt;En el caso de &lt;strong&gt;InputFormCustomValidator &lt;/strong&gt;lo estamos usando para realizar una validación sobre el field Due Date. Recuerda que la regla es NO permitir la captura de fechas mayores o iguales al dia de hoy. El control de validación custom &lt;strong&gt;InputFormCustomValidator&lt;/strong&gt;&amp;#160; nos permite asignar código compilado .NET para realizar la validación en cuestión, solo que bajo el contexto de ejecución de SharePoint se requeriría hacer algunas modificaciones en el web.config para permitir la compilación de la página, sin embargo, este control nos permite hacer lo mismo utilizando código del lado del cliente. Y justo ese es el escenario que pienso compartir aquí. &lt;/p&gt;  &lt;p&gt;Básicamente estamos confiando en realizar la validación desde el navegador de internet utilizando Javascript. Como ven, la propiedad &lt;strong&gt;ClientValidationFunction &lt;/strong&gt;apunta a una función Javascript “&lt;strong&gt;IsValidDate&lt;/strong&gt;” encargada de realizar la validación personalizada y este código javascript deberá de estar referenciado o registrado en la página en cuestión y lo hacemos agregandolo dentro de un Content Place Holder especial. Cuando el usuario capture una fecha sobre el control, este dispara el uso de la función javascript para validar la información capturada, la funcion javascript recibe en sus argumentos el source y args, en otras palabras el objeto que lo dispara y algunos argumentos del objeto como el valor que contiene. Cuando args.IsValid es igual a true significa que la validacion es correcta y por lo tanto hace que el control &lt;strong&gt;InputFormCustomValidator&lt;/strong&gt; no muestre el mensaje de error. Cuando es false, hace lo contrario.&lt;/p&gt;  &lt;p&gt;Este código javascipt lo podemos agregar justo al inicio de la página después de la declaración de las directivas:&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;&amp;lt;asp:Content ContentPlaceHolderId=&amp;quot;PlaceHolderAdditionalPageHead&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;function IsValidDate(source, args)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;var today = new Date(new Date().setHours(0,0,0,0));&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;var arrayDate = args.Value.split(&amp;quot;/&amp;quot;);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;var controlDate = new Date(arrayDate[2], arrayDate[0]-1, arrayDate[1]);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;args.IsValid =( today&amp;lt;controlDate);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;&amp;lt;/script&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#804040" size="1"&gt;&lt;strong&gt;&amp;lt;/asp:Content&amp;gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Como podemos ver utilizamos un Content Place Holder que no propiamente estaba declarado dentro de la página y adentro agregamos el javascript de la función &lt;strong&gt;IsValidDate&lt;/strong&gt; el cual recibe como argumento el dato que se desea validar. Con funcionalidad javascript se generan variables de tipo date para gestionar la comparación. &lt;/p&gt;  &lt;p&gt;El resultado:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/4848.image_5F00_4A0EA582.png"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/1222.image_5F00_thumb_5F00_6DC7CD1C.png" width="460" height="64" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;No olvides dar check in a la pagina para poder probarla. Para terminar, asegurate de especificar en las propiedades de la lista en cuestion tu nueva pagina como la pagina principal para agregar elementos en la lista. Con esto cuando un usuario de clic en New dentro de la lista, SharePoint carge la nueva pagina personalizada.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;En &lt;strong&gt;SPD&lt;/strong&gt;, das clic derecho sobre la lista en cuestion. &lt;/li&gt;    &lt;li&gt;Seleccionas &lt;strong&gt;Properties&lt;/strong&gt;. &lt;/li&gt;    &lt;li&gt;Seleccionas la pestaña &lt;strong&gt;Supporting Files &lt;/strong&gt;y en &lt;strong&gt;new item from&lt;/strong&gt; buscas la nueva pagina creada. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/0121.image_5F00_3B63F99D.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="image" border="0" alt="image" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/haarongonzalez.metablogapi/0243.image_5F00_thumb_5F00_6AD26869.png" width="669" height="453" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Credito a Hector Mata por el codigo javascript, gracias!&lt;/p&gt;</description></item></channel></rss>