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.

Anuncis

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