Mantenir l’scroll a cada postback

Denominem postback cada vegada que generem un event al servidor des d’una pàgina aspx. Aquests events poden ser generats per botons, llistes o caixes de text.

Sempre en els projectes que he fet o en els cursos que he impartit aquesta característica m’ha passat per alt, per varis motius crec jo:

  • Els projectes sempre s’ha donat el cas que les pàgines no son massa carregades de controls o s’utilitza ajax i per tant la necessitat de mantenir l’scroll no es troba de forma important.
  • En les formacions no és un concepte que es tingui present o que els alumnes preguntin, excepte avui, avui impartint un curs d’ASP.NET un alumne m’ha demanat com es pot fer amb ASP.NET per mantenir l’scroll a una pàgina en el moment que es fa un postback.

He decidit buscar la resposta i he quedat impressionat de la senzillesa que té.

Per mantenir l’scroll en una pàgina després d’un postback és tant fàcil com posar un atribut a la directiu page a true:

<%@ page  MaintainScrollPositionOnPostback="true"%>

Per mantenir l’scroll a totes les pàgines després d’un postback el posem al web.config:


< pages maintainScrollPositionOnPostBack="true">

I si és el cas que volem mantenir l’scroll d’una pàgina però en alguns postbacks llavors ho podem fer per programa:

System.Web.UI.Page.MaintainScrollPositionOnPostBack = true;

Aquest post ens ho explica molt i molt bé.

Sempre he dit que formar a professionals en .Net em fa apendre coses noves a cada curs.

Viewbox not firing events, Silverlight 4

En un dels projectes que estic desenvolupo amb Silverlight 4. Una pantalla està construïda per un Viewbox que té un Canvas. Dins el canvas tinc usercontrols.

<viewbox onMouseLeftUp="viewbox_mouseleftup" onmouseenter="viewbox_mouseenter">
<viewbox.resources>
<storyboard onCompleted="story_completed"/>
</viewbox.resources>
<canvas>
<usercontrol:myControl onMouseLeftUp="myControl_mouseleftup">
</canvas>
</viewbox>

El comportament és correcte la primera vegada que es carrega la pàgina. El mouseLeftUp es captura al MyControl i es propaga cap al ViewBox per bubbling i es torna a capturar a viewbox_mouseleftup. El clic del mouse comença l’animació i quan acaba es llença i captura l’event completed. Quan el mouse entra a la zona del viewbox aquest és capturat correctament per Viewbox_mouseenter.

El problema està quan es torna a carregar, ja sigui per un refresc (f5) o per una navegació provocada. Els events del Viewbox i del storyboard que son recursos del Viewbox no es capturen. El dels usercontrols que estan dins el canvas si.

He buscat i buscat per internet alguna possible solució al problema i no he trobat ningú que l’hi hagi passat alguna cosa similar.

La solució per mi ha sigut registrar els events per codi i no per XAML.

viewbox.mouseleftup+=viewbox_mouseleftup;
viewbox.mouseenter+=viewbox_mouseenter;
(viewbox.resources["storyboard1"] as Storyboard).completed=storyboard_completed;

Suposo que deu ser algun bug del Silverlight. Però no ho puc assegurar.

Em pots ajudar tu? saps què pot ser?

Sharepoint 2007 : Programar una còpia de seguretat

Fa poc vaig tenir la consulta de com poder fer una còpia de seguretat amb una instal·lació que jo mateix vaig posar en marxa del Sharepoint 2007 Services o WSS 3 per un client. El primer que vaig contestar va ser que des de del site d’administració del Sharepoint es pot configurar una còpia de seguretat. La sorpresa va ser quan vaig veure que el que pots fer és una còpia de seguretat directa, sense programació ni repetició.

Es tracta d’una instal·lació on tota la base de dades ocupa 40GB i no era el moment de fer-ho. Vaig optar per poder programar la còpia de seguretat. Des del site d’administració del Sharepoint no es pot fer aquesta tasca.

Des de Microsoft s’ens recomana utilitzar un fitxer de lots (els antics .bat) per tal de poder executar les còpies de seguretat de forma automàtica i programada.

Sembla antic i totalment fora de lloc però per el Shareopint 2007 és la única manera de poder-ho fer. Us passo el link on es parla i es detalla els passos que s’ha de seguir.

http://technet.microsoft.com/es-es/library/cc706871(office.12).aspx#section3

ASP.NET MVC 3

Si treballeu amb el Visual Studio 2010 ja heu vist que existeixen templates per poder crear projectes ASP.NET MVC.

El model de projecte MVC està basat en l’arquitectura Model Vista Controlador i per tant ens permet crear aplicacions web on dividim la càrrega de treball en diferents equips, de manera que cadascun pot treballar de forma independent. L’equip que implementa el model, un que implementa la UI i l’altre que implementa la lògica de procés. Amb els web forms no podem seguir aquesta arquitectura i per tant aplicacions web grans son més difícils de mantenir. Però el ASP.NET MVC és un canvi radical respecte als web forms, entre altres no existeix el viewstate i tampoc els events. Però no deixa de ser apassionant veure que existeix una altre manera de fer web.

Amb el Visual Studio 2010 teniu els templates per la versió 2. Ara us podeu descarregar la versió 3 que entre altres novetats hi ha el ple suport a poder programar en Html 5.

ASP.NET Controls de validació

Aquesta setmana passada estava donant una classe sobre els controls de validació que té ASP.NET em vaig trobar en una situació una mica peculiar. Aquesta vegada el grup que tenia a la classe van voler profunditzar més del que és habitual amb l’efectivitat i l’experiència d’usuari que tenen aquests controls.

Els controls que parlo son els RequieredValidator, RangeValidator, CustomValidator, RegularExpressionValidator i CompareValidator. Aquests controls permeten fer comprovacions a client i a servidor sense implementar pràcticament res. Només en el cas del CustomValidator hem de crear la funció javascript o el mètode en el code behind per comprovar la validesa del camp. Per tant, aquests controls ofereixen una validació dels camps en poc temps de desenvolupament, però només poden validar a nivell de camp o de formulari, mai a nivell de caràcter, és a dir, cada vegada que premem una tecla no podem llençar cap tipus de validació.

El problema està en quant es llença aquesta validació. No és llògic que s’ha de llençar la validació quan els camps perden el focus? sembla evident que si. Els controls de validació ASP.NET no estan preparats per validar els camps en quant es perd el focus, aquesta és una afirmació que es troba per internet, també s’afegeix que: sempre es fa validació camp a camp quan ja s’ha produït un submit. La veritat és que hi ha controls de validació que actuen sense fer un submit i n’hi ha que ho fan un cop s’ha escrit alguna cosa al camp. Però si que és veritat que hi ha alguna cosa que no es fa massa bé ja que no totes les validacions actuen igual.

No és lògic que es pugui marcar un camp en vermell en el moment que aquest presenta un error? sembla evident que si. Doncs aquests controls no estan preparats per poder marcar visualment el camp que ha produït l’error. Microsoft diu que és una mala pràctica perquè s’ha de tenir en compte els navegadors que no tenen gràfics o els que tenen problemes amb els colors. Però moltes vegades creem les nostres aplicacions per un grup concret de persones i podem controlar perfectament aquests aspectes.

Sincerament no havia tingut mai que profunditzar tant amb aquest tema i penso després de tot això de que els controls de validació d’ASP.NET estan molt bé però té mancances importants. Crec recordar ara que l’ASP.NET Ajax toolkit té un control de validació, possiblement aquest soluciona part d’aquests problemes.

Cannot find ServiceReferences.ClientConfig

Al meu últim post he parlat de com utilitzar els serveis de domini com una referència web. Quant es crea una referència de servei a una aplicació Silverlight es crea un enllaç entre els dos extrems i aquest està dins un fitxer anomenat ServiceReferences.ClientConfig i que és necessari per executar-se correctament. D’altre manera es produeix un error que ens indica que no es troba aquest fitxer.

En un entorn normal tenim l’aplicació Silverlight que és la que fa la referència al servei. Aquest fitxer es crea i s’empaqueta dins el .xap i per tant no tenim problemes. Però a vegades, pot ser una llibreria de Silverlight qui estigui fent la referència. Llavors l’aplicació Silverlight que utilitza aquesta llibreria no té cap ServiceReference.ClientConfig i el paquet .xap tampoc. D’aquesta manera l’aplicació Silverlight dóna problemes. Per solucionar-ho hem de crear un link al fitxer que es troba dins la llibreria.

http://www.global-webnet.net/blogengine/post/2009/01/03/PrismWCF-Cannot-find-ServiceReferencesClientConfig-in-xap-application-package.aspx

Use domain Services as Service References

Estic des de fa temps fent una aplicació amb Silverlight. Ja n’he parlat en altres posts d’aquesta tecnologia que em sembla perfecte per poder fer les aplicacions web més agradables a l’usuari sense sortir de l’entorn de .Net.

Aquesta setmana però m’he trobat amb la necessitat de tenir que afegir un servei Wcf que em servís els usuaris de la meva aplicació web. Tenia la opció d’afegir un simple Wcf Service habilitat per silverlight però he pensat que seria una bona oportunitat per utilitzar els serveis de domini (Domain Services) i així tenir-hi el primer contacte.

Els serveis de domini son serveis WCF que exposen operacions com a serveis i que al mateix moment poden treballar directament sobre una base de dades. El Domain Service és crear una clase, ASP.NET crea de forma automàtica un servei WCF a la següent direcció:

http://localhost:XXXX/Services/WebApplication1-DomainServices1.svc

WebApplication és l’aplicació web i DomainServices és el nom del servei de domini que s’ha creat. DomainService1 ha d’existir al root de la web, d’altre manera el servei WCF no es crea.

En el moment de voler utilitzar aquest servei des d’una aplicació client pot no ser trivial. En aquest link s’explica molt bé com fer ús del domain service com un WCF Service References. Per aconseguir posar una referència del servei el que hem de fer és descarregar-nos el WCF RIA toolkit i instal·lar una llibreria que necessitarem referenciar a la nostra aplicació web que ens serveix el servei de domini.

Afegir al web.config:
<configSections>
<sectionGroup name="system.serviceModel">
<section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
</sectionGroup>
</configSections>


<system.serviceModel>
<domainServices>
<endpoints>
<add name="soap" type="Microsoft.ServiceModel.DomainService.Hosting.SoapXmlEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
</endpoints>
</domainServices>
<system.serviceModel>
Un cop hem instal·lat el WCF RIA toolkit afegim la referència a Microsoft.ServiceModel.DomainServices.Hosting que trobem Microsoft SDKs/RIA Services/v1.0/Toolkit/Libraries folder

Després ja podrem afegir una referència de servei al nostre servei de domini sense problemes a l’aplicació client. Recordeu que si voleu les accions asincrones heu de configurar la referència des de l’aplicació client.

RIA Services:

http://www.silverlight.net/getstarted/riaservices/

http://msdn.microsoft.com/en-us/library/ee707344(v=vs.91).aspx

Actualitzant el Sql Server 2008 Managment Studio

En el meu post anterior vaig parlar de com instal·lar aquesta eina d’administració de la base de dades i de com de complicades poden ser les coses algunes vegades.

Ara toca parlar de com ho hem de fer si tenim instal·lat el Managment Studio 2005 i el volem passar a 2008. Sembla senzill però té el seu truc. Evidentment venim de l’escenari de tenir instal·lat l’Sql Server Express 2005 amb el seu Managment Studio i en un moment determinat s’instal·la el Sql Server Express 2008 com ho faria la instal·lació del Visual Studio 2010.

El primer que hem de fer, és tal i com es diu el post anterior, descarregar l’Sql Server Managment Studio 2008 i seguir els passos que molt bé es descriuen en aquest blog:

http://www.asql.biz/Articoli/SQLX08/Art3_1.aspx

Però hi ha un secret, tal i com es comenta en aquesta web, seguir els passos que vaig detallar en el meu post anterior no funciona. Efectivament, el primer que hauríem de fer en un entorn normal seria desinstal·lar Sql Server Express 2005, ja que no poden existir tots dos, i després procedir a la instal·lació seguint els passos:

  • Crear o ampliar una base de dades
  • seleccionar la base de dades existent
  • i tot seguit el component tal i com vam fer al post anterior.

Doncs no, no funciona, ni tant sols et deixa seleccionar el component que fa referència al Managment Studio.

Tal i com molt bé explica la web es tracta de seleccionar com si volguéssim una base de dades nova.

D’aquesta manera si podrem seleccionar el component Managment Studio

El més sorprenent de tot és que no et crea cap base de dades nova i et conserva la que tenies.

Un exemple més de que les coses s’haurien de fer més senzilles.

Instal·lant l’SQL Server 2008 Managment Studio Express

No sé per quina raó Microsoft ha anat canviant la manera d’instal·lar aquesta eina que permet administrar una base de dades com l’Sql Express. Amb l’SQL Express 2005 et podies descarregar l’aplicació separadament de la base de dades i tenia una mida de unes 40MB aprox., t’ho instal·laves i tot seguit ja podies començar a utilitzar-la.

Amb Sql Express 2008 ho he vist tot, primer va estar com aplicació individual com el seu predecessor, després el van passar a la plataforma Web Installer de Microsoft (molt bona per cert) però ara ni així.

Quan des de google busquem per Sql Server Managment Studio Express 2008 ens porta a una pàgina de descarrega que efectivament es titula Microsoft Sql Server 2008 Managment Studio Express. Fins aquí tot correcte però és aquí on ens adonem que alguna cosa no està bé, doncs la mida de la descarrega és de 190 MB aprox. Un cop descarregat l’executem i és on entrem en plena confusió: doncs es tracta del wizard d’instal·lació de la base de dades Sql Server Express. Creiem que ens hem equivocat, el tornem a baixar, però no. Què passa? Doncs que Microsoft va decidir que l’eina d’administració de la base de dades s’ha d’instal·lar mitjançant el propi instal·lador de la base de dades.

Quin son els passos que hem de fer? doncs en aquesta web està molt ben explicat.

http://www.asql.biz/Articoli/SQLX08/Art3_1.aspx

Es tracta principalment de seleccionar la opció de Crear o ampliar una instal·lació de Sql Server Express.

Seguint els passos següents ens permet seleccionar la base de dades existent i després els components que hi volem afegir, entre ells el Managment Studio.

Tot això és necessari per instal·lar una eina d’administració de la base de dades sempre i quant no instal·lem originalment la base de dades amb l’Sql Server 2008 Advanced Services que ja hi està tot inclòs.

Espereu el pròxim post que us parlaré de com actualitzar el Managment Studio del 2005 al 2008 i veureu com de complicades poden arribar a ser les coses.

Web Site vs Web Application

Actualment estic donant un curs de ASP.NET amb Visual Basic en una empresa on son experts amb programació amb ASP i per tant estan molt interessats en com podran migrar les seves aplicacions a ASP.NET i quina hauria de ser la millor manera o les millors pràctiques, és un grup molt interessat amb això i per això fan moltes preguntes.

Una d’elles va ser referent a quin tipus de projecte haurien d’utilitzar en el moment de fer una aplicació web. Web Site o Web Application?

Sempre que dono classes de ASP.NET explico que hi ha aquests dos tipus de projectes, comento les quatre diferencies principals que hi poden haver i obro un debat sobre què creuen els alumnes de quin és millor per ells. La meva és clarament Web Application. Per mi és més estructurat, ordenat i segueix la mateixa filosofia de qualsevol altre tipus de projecte com ara aplicacions windows, wpf o silverlight. Un cop exposada la meva opinió s’obre el debat. El més habitual és que els alumnes prefereixen el Web Site i és llavors on posem els punts a favor i punts en contra. Al final acabem decidint que va a gust del programador sempre i quan no hi hagi alguna excepció important que determini un model o altre.

Però aquesta vegada els alumnes van voler profunditzar més i el debat va durar més del compte. Això m’ha portat a buscar més informació de la que ja tenia jo referent a aquest tema. He trobat molta informació però la que crec que és millor és en aquesta web on es parla de les diferències que hi ha entre els dos models.

http://msdn.microsoft.com/en-us/library/aa730880(VS.80).aspx#wapp_topic5

Com també força interessant el que comenta aquest altre blog

http://www.codersbarn.com/post/2008/06/ASPNET-Web-Site-versus-Web-Application-Project.aspx