tag:blogger.com,1999:blog-11309624945154730642024-03-06T00:51:05.147+01:00To all Microsoft devs out there Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-1130962494515473064.post-76428311613178167412014-11-17T00:13:00.001+01:002014-11-17T00:13:14.423+01:00WCF – Service contract in a different project<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">I strongly recommend to implement service contracts in a separated project, <strong>why? </strong>Because in some scenarios I will need to share my contracts with external client applications, just because adding a "Web reference" is not a good idea, I agree it is easy, fast and can be updated from Visual Studio, but generated code is not managed by the developer & modify it is just a bug itself.</span><br />
<span xmlns="">When adding a WCF Service application to your solution, your new project will looks like this:</span><br />
<span xmlns=""><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiigus1Av0ZUFoePJAH7NQJ05w51yr49Jqv_oO2dMDGIN24uy_3cfmZmDU2xKfDaQEgnLg5fdf2OrLUuzIUbfqDQouw_OfTohUzqscqIiO_fGH2FwIfTO4z-XY37YEC5HyHR9FTDxQ2pZvy/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiigus1Av0ZUFoePJAH7NQJ05w51yr49Jqv_oO2dMDGIN24uy_3cfmZmDU2xKfDaQEgnLg5fdf2OrLUuzIUbfqDQouw_OfTohUzqscqIiO_fGH2FwIfTO4z-XY37YEC5HyHR9FTDxQ2pZvy/s1600/1.png" /></a></div>
<span xmlns=""><br /></span>
The Visual Studio template has done all the job for you:<br />
<ul>
<li><span xmlns="">IService1 contains the service contract</span></li>
<li><span xmlns="">Service1.svc.cs is the service it self</span></li>
</ul>
<span xmlns="">Ok, thanks Visual Studio for your help, but I prefer to do it by myself. First of all, "Service1" is not a proper name for a service, just remove the items generated by the Visual Studio and add a new WCF Service to your project (BusinessService in this example):</span><br />
<span xmlns=""><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHyX9yEd7qhDUJOwQ0H6AhSOyOljdwJ9euYi5hPenE8cgdBQX5PSe8UXiBhrUyxEtRIVq1a-28YaeArJJxseHsuzcDaOKKTuefRsEhyphenhyphen-u8_dvcsNgxbD_V1FGEWIl7DEFMLFxMss6iPzOQ/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHyX9yEd7qhDUJOwQ0H6AhSOyOljdwJ9euYi5hPenE8cgdBQX5PSe8UXiBhrUyxEtRIVq1a-28YaeArJJxseHsuzcDaOKKTuefRsEhyphenhyphen-u8_dvcsNgxbD_V1FGEWIl7DEFMLFxMss6iPzOQ/s1600/2.png" /></a></div>
<span xmlns=""><br /></span>
Once again, Visual Studio try to help me adding service contract and the service implementation in the project. This is not what I want so, I'm going to remove the IBusinessService, as I want it to be declared in a different project.<br />
<span xmlns="">Add a new project "ToAllMicrosoftDevsOutThere.Service.Contracts" to your solution, the implementation of your service contract will be there, including DataContracts and MessageContracts. Following references must be added to your contracts project:</span><br />
<ul>
<li><span xmlns="">System.ServiceModel</span></li>
<li><span xmlns="">System.Runtime.Serialization (for DataContracts/DataMember)</span></li>
</ul>
<span xmlns="">My service will contain just one operation (by now), defined on the service interface IBusinessService, which looks like:</span><br />
<span xmlns=""><br /></span>
<br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 626px;"></col></colgroup><tbody valign="top">
<tr><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-left: 7px; padding-right: 7px;"><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">[<span style="color: #4ec9b0;">ServiceContract<span style="color: gainsboro;">]</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;">public <span style="color: gainsboro;"><span style="color: #569cd6;">interface <span style="color: gainsboro;"><span style="color: #b8d7a3;">IBusinessService</span></span></span></span></span></span><br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">{</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> [<span style="color: #4ec9b0;">OperationContract<span style="color: gainsboro;">]</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #4ec9b0;"> DoWorkResponse<span style="color: gainsboro;"> DoWork(<span style="color: #4ec9b0;">DoWorkRequest<span style="color: gainsboro;"> request);</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span><br />
<span xmlns="">There are two interesting things on this interfaces:</span><br />
<ul>
<li><span xmlns="">My service interface must have the attribute 'ServiceContract'</span></li>
<li><span xmlns="">All my service operations must have the attribute 'OperationContract'</span></li>
</ul>
<span xmlns="">Next step, my Service can receive complex objects as requests and send complex responses. These objects usually named DTO (Data Transfer Objects), should not contain any business logic, only properties (get/set) containing all the data my service needs in order to provide a response. For defining these DTO I will use MessageContracts:</span><br />
<span xmlns=""><br /></span>
<br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 626px;"></col></colgroup><tbody valign="top">
<tr><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-left: 7px; padding-right: 7px;"><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">[<span style="color: #4ec9b0;">MessageContract<span style="color: gainsboro;">]</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;">public <span style="color: gainsboro;"><span style="color: #569cd6;">class <span style="color: gainsboro;"><span style="color: #4ec9b0;">DoWorkRequest</span></span></span></span></span></span><br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">{</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> [<span style="color: #4ec9b0;">MessageBodyMember<span style="color: gainsboro;">] </span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> public <span style="color: gainsboro;"><span style="color: #4ec9b0;">BusinessObjectDto<span style="color: gainsboro;"> BusinessEntity</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span><br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="background-color: black;"> }</span><br /> </span><br />
<br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">[<span style="color: #4ec9b0;">MessageContract<span style="color: gainsboro;">]</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;">public <span style="color: gainsboro;"><span style="color: #569cd6;">class <span style="color: gainsboro;"><span style="color: #4ec9b0;">DoWorkResponse</span></span></span></span></span></span><br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">{</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> [<span style="color: #4ec9b0;">MessageBodyMember<span style="color: gainsboro;">] </span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> public <span style="color: gainsboro;"><span style="color: #569cd6;">bool<span style="color: gainsboro;"> ItWasOk</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> { </span><span style="color: #569cd6; font-family: Consolas; font-size: 9pt;">get</span><span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">; </span><span style="color: #569cd6; font-family: Consolas; font-size: 9pt;">set</span><span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">; </span><span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">}</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span>In the previous code, I'm already using a DataContract (a data contract is a complex data type in my message contract):<br />
<span xmlns=""><br /></span>
<br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 626px;"></col></colgroup><tbody valign="top">
<tr><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-left: 7px; padding-right: 7px;"><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">[<span style="color: #4ec9b0;">DataContract<span style="color: gainsboro;">] </span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;">public <span style="color: gainsboro;"><span style="color: #569cd6;">class <span style="color: gainsboro;"><span style="color: #4ec9b0;">BusinessObjectDto</span></span></span></span></span></span><br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">{</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> [<span style="color: #4ec9b0;">DataMember<span style="color: gainsboro;">]</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #569cd6;"> public <span style="color: gainsboro;"><span style="color: #569cd6;">string<span style="color: gainsboro;"> Name</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> { </span><span style="color: #569cd6; font-family: Consolas; font-size: 9pt;">get</span><span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">; </span><span style="color: #569cd6; font-family: Consolas; font-size: 9pt;">set</span><span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">; </span><span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">}</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span>I need to add a reference to my contracts project on my service project and, now my projects structure looks like:<br />
<span xmlns=""><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH2-fBUC4VFlUWbzFOzc3zBsgcJW6KhTaRCGhlnqVFWKY8tVi19MynrSmBFWzsXO7vaodXFf2FrVRk4wTSGTPcy8qcWGUmBz3XelaV1VhLeAlSa2IpbaR88JXt0t-oiCbkObZk-UWzV3SB/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH2-fBUC4VFlUWbzFOzc3zBsgcJW6KhTaRCGhlnqVFWKY8tVi19MynrSmBFWzsXO7vaodXFf2FrVRk4wTSGTPcy8qcWGUmBz3XelaV1VhLeAlSa2IpbaR88JXt0t-oiCbkObZk-UWzV3SB/s1600/3.png" height="320" width="276" /></a></div>
<span xmlns=""><br /></span>
After adding the reference to my contracts project I can implement my Service contract on my service like follow:<br />
<span xmlns=""><br /></span>
<br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 626px;"></col></colgroup><tbody valign="top">
<tr><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-left: 7px; padding-right: 7px;"><span style="background-color: black; color: #569cd6; font-family: Consolas; font-size: 9pt;">namespace<span style="color: gainsboro;"> ToAllMicrosoftDevsOutThere<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Service<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Host</span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">{ </span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> public <span style="color: gainsboro;"><span style="color: #569cd6;">class <span style="color: gainsboro;"><span style="color: #4ec9b0;">BusinessService<span style="color: gainsboro;"> : <span style="color: #b8d7a3;">IBusinessService</span></span></span></span></span></span></span></span><br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> public <span style="color: gainsboro;"><span style="color: #4ec9b0;">DoWorkResponse<span style="color: gainsboro;"> DoWork(<span style="color: #4ec9b0;">DoWorkRequest<span style="color: gainsboro;"> request)</span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #569cd6;"> return <span style="color: gainsboro;"><span style="color: #569cd6;">new <span style="color: gainsboro;"><span style="color: #4ec9b0;">DoWorkResponse<span style="color: gainsboro;">() { ItWasOk <span style="color: #b4b4b4;">= <span style="color: gainsboro;"><span style="color: #569cd6;">true<span style="color: gainsboro;"> };</span></span></span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">}</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span>And that's all, just taking some minutes doing the setup of my WCF Service, I will be able to provide my Contract in a single DLL to any external application (.NET client…)<br />
<span xmlns="">Enjoy coding!</span></div>
Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com0Paris, France48.856614 2.352221900000017748.6894645 2.0294984000000178 49.0237635 2.6749454000000177tag:blogger.com,1999:blog-1130962494515473064.post-75372375883112070562014-11-16T16:24:00.001+01:002014-11-16T18:59:00.681+01:00Basic solution structure in Visual Studio<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns=""><br /><span style="font-family: Arial;">This is just a quick note about the way I structure my solutions in Visual Studio, it is not a good practice or a standard, it is just the way I like to structure my solutions. </span></span><br />
<br />
<h3 style="text-align: left;">
<span style="color: orange;">
Create the solution</span></h3>
<span xmlns=""><span style="font-family: Arial;">I know you can create your first project and creating the solution at the same time, but, come on! You are going to create your solution only once, take the time (and the pleasure) for creating it properly.</span><br /></span><br />
<div style="text-align: center;">
<span xmlns=""><img alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxelpc09NZnkQkFumie-Kf80X_UQQ_GB-Zx0AAMqU9nY_H7qafePlKaD53HxmZxqX87Kcd0i5eI6iZycHRDJxr-sZCZQJNSgjvQmrAEWvkv6Cadjp0IryvMqvlV5_yPmSkkZbIZ97HeJuo/s1600/1.png" height="232" width="400" /><span style="font-family: Arial;"><br /></span></span></div>
<h3 style="text-align: left;">
<span style="color: orange;"><br/>
Use solution folders</span></h3>
<span xmlns=""><span style="font-family: Arial;">This is the best way for structure all you projects within the solution. I structure my projects in folders depending of the module they belong.</span></span><br /><br/>
<div style="text-align: center;">
<span xmlns=""><img alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqB2VgX8BTRWaEsJRaHsDk9lp2eI2y8zY_Iwg40niYRpLERLNW3y8bo_nKTt7Im0pRgzUePCwf2g-omeBq4IRyDnfY6v1xvvo-WtuCMj2Q4ONhEBG27io779qr_SZ_bquoNZ5vJZVPUoZk/s1600/2.png" height="211" width="320" /><br /> </span></div>
<br />
<h3 style="text-align: left;">
<span style="color: orange;">
Order your folders</span></h3>
<span style="font-family: Arial;">As you can see on the previous picture I have created a folder for each layer in my applications (Client & Service), personally I like order my projects from more external to deeper layer (understanding my database layer is the deeper one).</span>
<br /><br />
<div style="text-align: center;">
<span xmlns=""><img alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS-kwUCYifqNiy-g65S3jKAX3UQc-EHqL_ixHQsm_xLji6PCCJCY1xfXk9K6pSqO-M1JCgEDsPxYDWJGnky-u9FOQGwJywIVfu2gCkBgJVbyXg8qmuKDpXBM5hXmiTLUPicEd5pvQlEYy3/s1600/3.png" height="222" width="320" /><br /> </span></div>
<span xmlns=""><br /> </span>
<br />
<h3 style="text-align: left;">
<span style="color: orange;">
Enjoy coding</span></h3>
<span xmlns=""><span style="font-family: Arial;">Now I have created my solution structure I can follow up writing other posts using this solution structure!</span></span></div>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com0Paris, France48.856614 2.352221900000017748.6894645 2.0294984000000178 49.0237635 2.6749454000000177tag:blogger.com,1999:blog-1130962494515473064.post-80339725522482513962014-11-02T21:00:00.001+01:002014-11-03T00:53:24.403+01:00NHibernate - Configuración<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns=""><br /><br /><span style="font-family: Arial;">Partamos de un dominio sencillo: Autores literarios y sus libros, nuestro dominio sería algo como:</span><br /><span style="font-size: 12pt;"><br /> </span></span><br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 1049px;"></col></colgroup><tbody valign="top">
<tr style="height: 220px;"><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-bottom: 1px; padding-left: 7px; padding-right: 7px; padding-top: 1px;" valign="middle"><span style="color: #569cd6;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;">public class <span style="color: #4ec9b0;">Author</span></span><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="font-family: Consolas; font-size: 9pt;">{</span><span style="color: #569cd6;"><br /><span style="font-family: Consolas; font-size: 9pt;"> public virtual int <span style="color: gainsboro;">Id</span></span><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> public virtual string<span style="color: gainsboro;"> FirstName</span></span><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"><br /><span style="color: #569cd6;"> public virtual string<span style="color: gainsboro;"> LastName</span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span><br /><span style="font-family: Consolas; font-size: 9pt;"><span style="background-color: black;"><br /></span><span style="color: #569cd6;"> public virtual <span style="color: #b8d7a3;">IEnumerable<span style="color: #b4b4b4;"><<span style="color: #4ec9b0;">Book<span style="color: #b4b4b4;">><span style="color: gainsboro;"> Books</span></span></span></span></span></span></span><br /><span style="font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;">}</span></span></span></span></span></span></span></span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span><br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 1048px;"></col></colgroup><tbody valign="top">
<tr style="height: 178px;"><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-bottom: 1px; padding-left: 7px; padding-right: 7px; padding-top: 1px;" valign="middle"><span style="color: #569cd6;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;">public class <span style="color: #4ec9b0;">Book</span></span><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="font-family: Consolas; font-size: 9pt;">{</span><span style="color: #569cd6;"><br /><span style="font-family: Consolas; font-size: 9pt;"> public virtual int <span style="color: gainsboro;">Id</span></span><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> public virtual string<span style="color: gainsboro;"> Title</span></span><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span><br /><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="font-family: Consolas; font-size: 9pt;"> public virtual string Description</span><span style="color: #569cd6;"><br /><span style="color: gainsboro;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span><br /><span style="font-family: Consolas; font-size: 9pt;"><span style="background-color: black;"><br /></span><span style="color: #569cd6;"> public virtual <span style="color: #4ec9b0;">Author<span style="color: gainsboro;"> Author</span></span></span></span><br /><span style="font-family: Consolas; font-size: 9pt;"> { <span style="color: #569cd6;">get<span style="color: gainsboro;">; <span style="color: #569cd6;">set<span style="color: gainsboro;">; }</span></span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;">}</span></span></span></span></span></span></span></span></span></span></span></span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /><span style="font-family: Arial;">Para asegurar la independencia de nuestro dominio de la tecnología que utilicemos para el acceso a datos, en este caso NHibernate, vamos a crear un nuevo proyecto y añadir la referencia a NHibernate en este nuevo proyecto. Además de la referencia a NHibernate, he añadido la una referencia a FluentNHibernate, para poder configurar mi dominio (prometo volver sobre el uso de Fluent en otro post).<br />En este momento nuestro proyecto tiene la estructura siguiente:</span><br /><br /><br /> </span><br />
<div style="text-align: center;">
<span xmlns=""><img alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9-eUpGkU81kfYocWiWraNjZGiJWmn1GiFfRoJLnr58OJzu6e8GzR05achursB4Jth3qKBcIVNNmcLs6kGKM3w4-rplzsmeiXci5RovendKe433xv1rthIaXIWnW7gZuI_BHAchpnwM4hJ/s1600/solutionstructure.png" height="400" width="380" /><br /><br /> </span></div>
<span xmlns=""><br /><span style="font-family: Arial;">El siguiente pase es la configuración del mapping de NHibernate, para ello vamos a utilizar Fluent NHibernate. Cada objeto del dominio se mapea en una clase ClassMap de nuestro proyecto de acceso a datos:</span><br /><br /> </span><br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 1164px;"></col></colgroup><tbody valign="top">
<tr style="height: 215px;"><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-bottom: 1px; padding-left: 7px; padding-right: 7px; padding-top: 1px;" valign="middle"><span style="color: #569cd6;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;">public class <span style="color: #4ec9b0;">AuthorMap<span style="color: gainsboro;"> : <span style="color: #4ec9b0;">ClassMap<span style="color: #b4b4b4;"><<span style="color: #4ec9b0;">Author<span style="color: #b4b4b4;">><span style="color: gainsboro;"><br /></span></span></span></span></span></span></span></span><br /><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">{</span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> public<span style="color: gainsboro;"> AuthorMap()</span></span><br /><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br /><span style="color: gainsboro;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> Id(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Id)</span></span></span></span></span><br /><span style="color: #b4b4b4;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> .<span style="color: gainsboro;">Column(<span style="color: #d69d85;">"Id"<span style="color: gainsboro;">)</span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> .<span style="color: gainsboro;">GeneratedBy<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Identity();</span></span></span></span><br /><span style="color: gainsboro;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> Map(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">FirstName)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Column(<span style="color: #d69d85;">"FirstName"<span style="color: gainsboro;">)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Not<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Nullable();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; font-family: Consolas; font-size: 9pt;"> Map(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">LastName)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Column(<span style="color: #d69d85;">"LastName"<span style="color: gainsboro;">)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Nullable();</span></span></span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; font-family: Consolas; font-size: 9pt;"> HasMany(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Books)</span></span></span></span></span><br />
<span style="color: #b4b4b4;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> .<span style="color: gainsboro;">KeyColumn(<span style="color: #d69d85;">"AuthorId"<span style="color: gainsboro;">)</span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> .<span style="color: gainsboro;">Inverse()</span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> .<span style="color: gainsboro;">Cascade<span style="color: #b4b4b4;">.<span style="color: gainsboro;">AllDeleteOrphan();</span></span></span></span><br /><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br /><span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">}</span></span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span><br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 1165px;"></col></colgroup><tbody valign="top">
<tr style="height: 225px;"><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-bottom: 1px; padding-left: 7px; padding-right: 7px; padding-top: 1px;" valign="middle"><span style="color: #569cd6;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;">public class <span style="color: #4ec9b0;">BookMap<span style="color: gainsboro;"> : <span style="color: #4ec9b0;">ClassMap<span style="color: #b4b4b4;"><<span style="color: #4ec9b0;">Book<span style="color: #b4b4b4;">><span style="color: gainsboro;"><br /></span></span></span></span></span></span></span></span><br /><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">{</span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> public<span style="color: gainsboro;"> BookMap()</span></span><br /><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br /><span style="color: gainsboro;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> Id(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Id)</span></span></span></span></span><br /><span style="color: #b4b4b4;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> .<span style="color: gainsboro;">Column(<span style="color: #d69d85;">"Id"<span style="color: gainsboro;">)</span></span></span></span><br /><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> .<span style="color: gainsboro;">GeneratedBy<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Identity();</span></span></span></span><br /><span style="color: gainsboro;"><span style="background-color: black; font-family: Consolas; font-size: 9pt;"> Map(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Title)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Column(<span style="color: #d69d85;">"Title"<span style="color: gainsboro;">)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Not<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Nullable();</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; font-family: Consolas; font-size: 9pt;"> Map(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Description)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Column(<span style="color: #d69d85;">"Description"<span style="color: gainsboro;">)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Nullable();</span></span></span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; font-family: Consolas; font-size: 9pt;"> References(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Author)<span style="color: #b4b4b4;">.<span style="color: gainsboro;">Column(<span style="color: #d69d85;">"AuthorId"<span style="color: gainsboro;">);</span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; font-family: Consolas; font-size: 9pt;"> }</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">}</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /><span style="font-family: Arial;">Ya solo queda crear un proyecto de tests para probar nuestra configuracion, el test siguiente prueba el almacenamiento de un autor y su libro asociado</span><br /><br /> </span><br />
<div>
<table border="0" style="background: black; border-collapse: collapse;"><colgroup><col style="width: 1165px;"></col></colgroup><tbody valign="top">
<tr style="height: 225px;"><td style="border-bottom: solid 0.5pt; border-left: solid 0.5pt; border-right: solid 0.5pt; border-top: solid 0.5pt; padding-bottom: 1px; padding-left: 7px; padding-right: 7px; padding-top: 1px;" valign="middle"><span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;">[<span style="color: #4ec9b0;">TestClass<span style="color: gainsboro;">]</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><br /> <span style="color: #569cd6;">public <span style="color: gainsboro;"><span style="color: #569cd6;">class <span style="color: gainsboro;"><span style="color: #4ec9b0;">DataTests<span style="color: gainsboro;"><br /> </span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><br /> <span style="color: #569cd6;"> private <span style="color: gainsboro;"><span style="color: #569cd6;">static <span style="color: gainsboro;"><span style="color: #b8d7a3;">ISessionFactory<span style="color: gainsboro;"> _sessionFactory; </span></span></span></span></span></span></span><br />
<br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">[</span><span style="color: #4ec9b0; font-family: Consolas; font-size: 9pt;">TestInitialize<span style="color: gainsboro;">]</span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> public <span style="color: gainsboro;"><span style="color: #569cd6;">void<span style="color: gainsboro;"> Init()</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> _sessionFactory <span style="color: #b4b4b4;">= </span></span><span style="color: #4ec9b0; font-family: Consolas; font-size: 9pt;">Fluently</span><span style="color: #b4b4b4; font-family: Consolas; font-size: 9pt;">.<span style="color: gainsboro;">Configure()</span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #b4b4b4;"> .<span style="color: gainsboro;">Database(<span style="color: #4ec9b0;">MsSqlConfiguration<span style="color: #b4b4b4;">.<span style="color: gainsboro;">MsSql2012</span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #b4b4b4;"> .<span style="color: gainsboro;">ConnectionString(x <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> x<span style="color: #b4b4b4;">.<span style="color: gainsboro;">FromConnectionStringWithKey(<span style="color: #d69d85;">"sample"<span style="color: gainsboro;">)))</span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #b4b4b4;"> .<span style="color: gainsboro;">Mappings(m <span style="color: #b4b4b4;">=><span style="color: gainsboro;"> m<span style="color: #b4b4b4;">.<span style="color: gainsboro;">FluentMappings<span style="color: #b4b4b4;">.<span style="color: gainsboro;">AddFromAssemblyOf<span style="color: #b4b4b4;"><<span style="color: #4ec9b0;">AuthorMap<span style="color: #b4b4b4;">><span style="color: gainsboro;">())</span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #b4b4b4;"> .<span style="color: gainsboro;">BuildSessionFactory();</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br />
<br />
<span style="color: gainsboro; font-family: Consolas; font-size: 9pt;">[</span><span style="color: #4ec9b0; font-family: Consolas; font-size: 9pt;">TestMethod<span style="color: gainsboro;">]</span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> public <span style="color: gainsboro;"><span style="color: #569cd6;">void<span style="color: gainsboro;"> SaveAuthor_Author_AuthorSaved()</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> var<span style="color: gainsboro;"> author <span style="color: #b4b4b4;">= <span style="color: gainsboro;"><span style="color: #569cd6;">new <span style="color: gainsboro;"><span style="color: #4ec9b0;">Author<span style="color: gainsboro;">()</span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> FirstName <span style="color: #b4b4b4;">= <span style="color: gainsboro;"><span style="color: #d69d85;">"Orson"<span style="color: gainsboro;">,</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> LastName <span style="color: #b4b4b4;">= <span style="color: gainsboro;"><span style="color: #d69d85;">"Scott Card"<span style="color: gainsboro;">,</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> Books <span style="color: #b4b4b4;">= <span style="color: gainsboro;"><span style="color: #569cd6;">new <span style="color: gainsboro;"><span style="color: #4ec9b0;">List<span style="color: #b4b4b4;"><<span style="color: #4ec9b0;">Book<span style="color: #b4b4b4;">><span style="color: gainsboro;">() { </span></span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><span style="color: #569cd6;"> new <span style="color: gainsboro;"><span style="color: #4ec9b0;">Book<span style="color: gainsboro;">()</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> Description <span style="color: #b4b4b4;">= <span style="color: gainsboro;"><span style="color: #d69d85;">"Ender's Game is a 1985 military science fiction novel"<span style="color: gainsboro;">,</span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> Title<span style="color: #b4b4b4;">= <span style="color: gainsboro;"><span style="color: #d69d85;">"Ender's Game"<span style="color: gainsboro;"><br /> </span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> };</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"><br /> <span style="color: #569cd6;"> using<span style="color: gainsboro;"> (<span style="color: #569cd6;">var<span style="color: gainsboro;"> session <span style="color: #b4b4b4;">=<span style="color: gainsboro;"> _sessionFactory<span style="color: #b4b4b4;">.<span style="color: gainsboro;">OpenSession())</span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> <span style="color: #569cd6;"> using<span style="color: gainsboro;"> (<span style="color: #569cd6;">var<span style="color: gainsboro;"> transaction <span style="color: #b4b4b4;">=<span style="color: gainsboro;"> session<span style="color: #b4b4b4;">.<span style="color: gainsboro;">BeginTransaction())</span></span></span></span></span></span></span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> {</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> session<span style="color: #b4b4b4;">.<span style="color: gainsboro;">SaveOrUpdate(author);</span></span></span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span><br />
<span style="background-color: black; color: gainsboro; font-family: Consolas; font-size: 9pt;"> }</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /><br /> </span></div>
Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com0Paris, France48.856614 2.352221900000017748.6894645 2.0294984000000178 49.0237635 2.6749454000000177tag:blogger.com,1999:blog-1130962494515473064.post-60488600419072394542010-01-08T00:58:00.000+01:002014-11-17T01:33:29.482+01:00ASP.NET Llamar JavaScript desde C#<div dir="ltr" style="text-align: left;" trbidi="on">
<span xmlns=""></span><br />
<span xmlns="">Voy a explicarte un ejemplo con un par de posibilidades para llamar a un método JavaScript desde tu código de servidor C#. La clave está en el método "<em>RegisterStartupScript</em>" que nos permite registrar un código JavaScript desde el código de C# y que éste sea interpretado por el navegador. Te puedes descargar el código de ejemplo <a href="http://javascriptcsharp.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38407">aquí</a>.</span><br />
<span xmlns="">La primera posibilidad es que quieras invocar un método JavaScript desde el Page_Load de tu página ASPX, para ello puedes hacer lo siguiente:</span><br />
<span xmlns=""><br /> </span><br />
<div>
<table border="0" style="background: white; border-collapse: collapse;"><colgroup><col style="width: 580px;"></col></colgroup><tbody valign="top">
<tr><td style="border-bottom: dashed 0.5pt; border-left: dashed 0.5pt; border-right: dashed 0.5pt; border-top: dashed 0.5pt; padding-bottom: 1px; padding-left: 6px; padding-right: 6px; padding-top: 1px;" valign="middle"><span style="color: grey; font-family: Courier New; font-size: 10pt;">///<summary></span><br />
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: grey;">///</span><span style="color: green;"> Evento de carga de la página</span></span><br />
<span style="color: grey; font-family: Courier New; font-size: 10pt;">///</summary></span><br />
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: grey;">///</span><span style="color: green;"><br /> </span><span style="color: grey;"><param name="sender"></param></span></span><br />
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: grey;">///</span><span style="color: green;"><br /> </span><span style="color: grey;"><param name="e"></param></span></span><br />
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">protected</span><br /> <span style="color: blue;">void</span> Page_Load(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</span><br />
<span style="font-family: Courier New; font-size: 10pt;">{</span><br />
<div style="margin-left: 36pt;">
<span style="color: green; font-family: Courier New; font-size: 10pt;">//Se llama a un javascript cuando la página carga</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">string</span> mensaje = <span style="color: #a31515;">"Este mensaje se genera desde c#"</span>;</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">ClientScript.RegisterStartupScript(<span style="color: blue;">this</span>.GetType(), <span style="color: #a31515;">"myScript"</span>, <span style="color: #a31515;">"<script>javascript:mostrarMensaje('"</span> + mensaje + <span style="color: #a31515;">"');</script>"</span>);</span></div>
<span style="font-family: Courier New; font-size: 10pt;">}</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span><br />
<span xmlns="">La segunda posibilidad es que quieras ejecutar un método JavaScript desde el evento de un control de tu página ASPX:</span><br />
<span xmlns=""><br /> </span><br />
<div>
<table border="0" style="background: white; border-collapse: collapse;"><colgroup><col style="width: 580px;"></col></colgroup><tbody valign="top">
<tr><td style="border-bottom: dashed 0.5pt; border-left: dashed 0.5pt; border-right: dashed 0.5pt; border-top: dashed 0.5pt; padding-bottom: 1px; padding-left: 6px; padding-right: 6px; padding-top: 1px;" valign="middle"><span style="color: grey; font-family: Courier New; font-size: 10pt;">///<summary></span><br />
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: grey;">///</span><span style="color: green;">El botón va a ejecutar un código javascript</span></span><br />
<span style="color: grey; font-family: Courier New; font-size: 10pt;">///</summary></span><br />
<span style="color: grey; font-family: Courier New; font-size: 10pt;">///<param name="sender"></param></span><br />
<span style="color: grey; font-family: Courier New; font-size: 10pt;">///<param name="e"></param></span><br />
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">protected</span><br /> <span style="color: blue;">void</span> btnClick_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</span><br />
<span style="font-family: Courier New; font-size: 10pt;">{</span><br />
<div style="margin-left: 36pt;">
<span style="color: green; font-family: Courier New; font-size: 10pt;">//Se genera el código javascript que se quiere ejecutar</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">System.Text.<span style="color: #2b91af;">StringBuilder</span> sb = <span style="color: blue;">new</span> System.Text.<span style="color: #2b91af;">StringBuilder</span>();</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">sb.Append(<span style="color: #a31515;">@"<script language='javascript'>"</span>);</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">sb.Append(<span style="color: #a31515;">@"var lbl = document.getElementById('lblMensaje');"</span>);</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">sb.Append(<span style="color: #a31515;">@"lbl.style.color='red';"</span>);</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">sb.Append(<span style="color: #a31515;">@"alert(lbl.innerText);"</span>);</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">sb.Append(<span style="color: #a31515;">@"</script>"</span>);</span></div>
<div style="margin-left: 36pt;">
<br /> </div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">if</span> (!ClientScript.IsStartupScriptRegistered(<span style="color: #a31515;">"JSScript"</span>))</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">{</span></div>
<div style="margin-left: 72pt;">
<span style="font-family: Courier New; font-size: 10pt;">ClientScript.RegisterStartupScript(<span style="color: blue;">this</span>.GetType(), <span style="color: #a31515;">"JSScript"</span>, sb.ToString());</span></div>
<div style="margin-left: 36pt;">
<span style="font-family: Courier New; font-size: 10pt;">}</span></div>
<span style="font-family: Courier New; font-size: 10pt;">}</span></td></tr>
</tbody></table>
</div>
<span xmlns=""><br /> </span><br />
<span xmlns="">Espero que te sea de utilidad y recuerda que puedes descarte el código <a href="http://javascriptcsharp.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38407">aquí</a>.</span><br />
</div>
Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com14tag:blogger.com,1999:blog-1130962494515473064.post-13724195256972731712010-01-08T00:18:00.000+01:002014-11-17T01:34:29.676+01:00ASP.NET Depurar JavaScript<span xmlns=''><p>En este post te voy a explicar cómo depurar un Java Script.<br /></p><p>Depurarlo no es complicado, basta simplemente con incluir una instrucción "<em>debugger</em>;" dentro de tu código de JavaScript, de esta forma, cuando este código pase a ejecutarse el depurador de Visual Studio se parará tal como lo hace en un break-point de tu código C#.<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:579px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>script </span><span style='color:red'>language</span><span style='color:blue'>="javascript" </span><span style='color:red'>type</span><span style='color:blue'>="text/javascript"></span><br /> </span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>function</span> mostrarMensaje(mensaje) <br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>debugger</span>; <br /></span></p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>alert(mensaje); <br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>script</span><span style='color:blue'>></span></span></p></td></tr></tbody></table></div><p><br /> </p><p>Como puedes ver en la siguiente imagen Visual Studio te permite incluso de explorar los valores de tus variables dentro de tu JavaScript:<br /></p><p style='text-align: center'><a href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRGAePLZrDFH3E3dl3b6FWJUHWpQSxexPain9pqI48o6MQgUHU2pyEscdKkZVLUadO6txnkC9A2ECAM7fIYQSOim0WRJuhCDzfpYeKbLFnkR73YCzIDoycww-Pmv5qLOg-vnqrM5oVWv5/s1600-h/aspnet_depurando_javascript.PNG'><img border='0' alt='' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeRGAePLZrDFH3E3dl3b6FWJUHWpQSxexPain9pqI48o6MQgUHU2pyEscdKkZVLUadO6txnkC9A2ECAM7fIYQSOim0WRJuhCDzfpYeKbLFnkR73YCzIDoycww-Pmv5qLOg-vnqrM5oVWv5/s320/aspnet_depurando_javascript.PNG'/></a><br /> </p><p><br /> </p><p>Espero que te sirva!</p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com1tag:blogger.com,1999:blog-1130962494515473064.post-37965461066081429092010-01-06T22:43:00.000+01:002014-11-17T01:34:29.699+01:00ASP.NET Ajax - Añadir triggers a un UpdatePanel dinámicamente<span xmlns=''><p>Este post te será útil en el caso de que estés interesado en añadir eventos como triggers de Update Panels programáticamente en tiempo de ejecución.<br /></p><p>Cuando se añaden Triggers a un update panel en tiempo de diseño, el aspecto de nuestra página será el siguiente:<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>UpdatePanel</span><br /> <span style='color:red'>ID</span><span style='color:blue'>="UpdatePanel1"</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"</span><br /> <span style='color:red'>ChildrenAsTriggers</span><span style='color:blue'>="False"</span><br /> <span style='color:red'>UpdateMode</span><span style='color:blue'>="Conditional"><br /></span></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'><</span><span style='color:#a31515'>ContentTemplate</span><span style='color:blue'>><br /></span></span></p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>Button</span><br /> <span style='color:red'>ID</span><span style='color:blue'>="BtnAcceptar"</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"</span><br /> <span style='color:red'>Text</span><span style='color:blue'>="Aceptar"</span><br /> <span style='color:red'>OnClick</span><span style='color:blue'>="BtnAcceptar_Click"</span><br /> <span style='color:blue'>/><br /></span></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'></</span><span style='color:#a31515'>ContentTemplate</span><span style='color:blue'>><br /></span></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'><</span><span style='color:#a31515'>Triggers</span><span style='color:blue'>><br /></span></span></p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>AsyncPostBackTrigger</span><br /> <span style='color:red'>ControlID</span><span style='color:blue'>="BtnAcceptar"</span><br /> <span style='color:red'>EventName</span><span style='color:blue'>="Click"</span><br /> <span style='color:blue'>/><br /></span></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'></</span><span style='color:#a31515'>Triggers</span><span style='color:blue'>><br /></span></span></p><p><span style='font-family:Courier New; font-size:9pt'><span style='color:blue'></</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>UpdatePanel</span><span style='color:blue'>></span></span></p></td></tr></tbody></table></div><p><br /> </p><p>Si tus necesidades precisan que estos triggers sean añadidos en tiempo de ejecución utiliza el siguiente código: <br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>AsyncPostBackTrigger</span> Trigger = <span style='color:blue'>new</span><br /> <span style='color:#2b91af'>AsyncPostBackTrigger</span>();<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:green'>//ControlID = ID del control que provoca el evento.</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>Trigger.ControlID = ControlID;<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:green'>//EventName = Nombre del evento, p.e: Click, SelectedIndexChange.</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>Trigger.EventName = EventName;<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:green'>//Se añade el trigger al update panel</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>UpdatePanel1.Triggers.Add(Trigger);</span></p></td></tr></tbody></table></div><p><br /> </p><p>Espero que te sea de utilidad!<br /></p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com2tag:blogger.com,1999:blog-1130962494515473064.post-24460647357809026402010-01-06T21:43:00.000+01:002014-11-17T01:34:29.695+01:00.NET Log en el Visor de Sucesos (Event Viewer)<span xmlns=''><p>En este post quiero mostrarte como utilizar el visor de sucesos como para persistir los eventos de tu aplicación.<br /></p><p>El soporte de Microsoft dice lo siguiente:<br /></p><p>"<em>Los registros de sucesos proporcionan un medio estándar y centralizado para que las aplicaciones graben sucesos (eventos) de software y hardware importantes. Windows suministra una interfaz de usuario estándar para ver los registros: el Visor de sucesos</em>" (<a href='http://support.microsoft.com/kb/307024/es'>aquí</a>)<br /></p><p>No quiero contradecirlos pero, en mi opinión, no tendríamos que abusar del uso del registro de sucesos por las siguientes razones:<br /></p><ol><li>El registro de sucesos se llena. A mí ya me ha ocurrido en una máquina XP, entiendo que en un servidor el tamaño será mucho más grande.<br /></li><li>La explotación de estadísticas. Es habitual querer obtener estadísticas de los eventos que provocan nuestras aplicaciones.<br /></li><li>Mantenimiento de aplicaciones. El Visor de Sucesos muestra los eventos escritos por todas las aplicaciones del sistema, por tanto es más difícil encontrar el evento que buscamos.<br /></li></ol><p>Mi recomendación sería usar una base de datos para persistir nuestros logs del tipo que sean (auditoría, errores, informativos…), para poder explotar estos datos. Aún así, los eventos informados en el registro de sucesos dan un aspecto más profesional a nuestras aplicaciones, pudiendo seleccionar ciertos eventos de nuestra aplicación que deberíamos persistir en el registro de eventos.<br /></p><p>El uso es sencillo lo podéis ver <a href='http://support.microsoft.com/kb/307024/es'>aquí</a>.<br /></p><p>Sólo tienes que crear un nuevo proyecto usando la plantilla de "<em>Aplicación del Consola</em>" y tener el código siguiente en tu clase Main:<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>static</span><br /> <span style='color:blue'>void</span> Main(<span style='color:blue'>string</span>[] args)<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> sSource;<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> sLog;<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> sEvent;<br /></span></p><p style='margin-left: 36pt'><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>sSource = <span style='color:#a31515'>"Nombre de mi aplicación"</span>;<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>sLog = <span style='color:#a31515'>"Application"</span>;<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>sEvent = <span style='color:#a31515'>"Mensaje de nuestro evento"</span>;<br /></span></p><p style='margin-left: 36pt'><span style='color:green; font-family:Courier New; font-size:10pt'>//Se añade nuestra aplicación como generadora de eventos si esta no existe<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (!<span style='color:#2b91af'>EventLog</span>.SourceExists(sSource))<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>EventLog</span>.CreateEventSource(sSource, sLog);<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}<br /></span></p><p style='margin-left: 36pt'><br /> </p><p style='margin-left: 36pt'><span style='color:green; font-family:Courier New; font-size:10pt'>//Se escribe una Advertencia/Warning<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>EventLog</span>.WriteEntry(sSource, sEvent, <span style='color:#2b91af'>EventLogEntryType</span>.Warning, 230);<br /></span></p><p style='margin-left: 36pt'><span style='color:green; font-family:Courier New; font-size:10pt'>//Se escribe un error<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>EventLog</span>.WriteEntry(sSource, sEvent, <span style='color:#2b91af'>EventLogEntryType</span>.Error, 231);<br /></span></p><p style='margin-left: 36pt'><span style='color:green; font-family:Courier New; font-size:10pt'>//Se escribe un error<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>EventLog</span>.WriteEntry(sSource, sEvent, <span style='color:#2b91af'>EventLogEntryType</span>.FailureAudit, 232);<br /></span></p><p style='margin-left: 36pt'><span style='color:green; font-family:Courier New; font-size:10pt'>//Se escribe un error<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>EventLog</span>.WriteEntry(sSource, sEvent, <span style='color:#2b91af'>EventLogEntryType</span>.Information, 233);<br /></span></p><p style='margin-left: 36pt'><span style='color:green; font-family:Courier New; font-size:10pt'>//Se escribe un er<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>EventLog</span>.WriteEntry(sSource, sEvent, <span style='color:#2b91af'>EventLogEntryType</span>.SuccessAudit, 234);<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'>}</span></p></td></tr></tbody></table></div><p><br /> </p><p>Una vez ejecutes la aplicación consulta el visor de sucesos de tu máquina: <em>Inicio > Ejecutar >eventvwr</em>. Este tendrá el aspecto que puedes ver en la imagen siguiente:<br /></p><p><br /> </p><p style='text-align: center'><a href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRDHQtd0Fzs-tNsjZ0Uzk7cTEfNCrZ7YIVSZDo7scB6k81wnrQatTLJgbDXJpcJVQnCXKtytL9wr-CjIs4sFDjM23q_i2R0h2oQxAhKm3MhVvyQB0A7OghcB5LZ4FDcqDqh5vBPQz1TAqE/s1600-h/aspnet_log_visor_sucesos.PNG'><img border='0' alt='' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRDHQtd0Fzs-tNsjZ0Uzk7cTEfNCrZ7YIVSZDo7scB6k81wnrQatTLJgbDXJpcJVQnCXKtytL9wr-CjIs4sFDjM23q_i2R0h2oQxAhKm3MhVvyQB0A7OghcB5LZ4FDcqDqh5vBPQz1TAqE/s320/aspnet_log_visor_sucesos.PNG'/></a><br /> </p><p style='text-align: center'><br /> </p><p>Espero que te sea útil este post y si tienes alguna duda realiza un comentario.</p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com1tag:blogger.com,1999:blog-1130962494515473064.post-16666241728757716442010-01-02T16:59:00.000+01:002014-11-17T01:34:29.681+01:00ASP.NET WebParts<span xmlns=''><p>Échale un ojo a este vídeo, explica el uso de los WebParts. Imaginas como se puede mejorar la administración de un sitio si permitimos a un usuario administrador cambiar los paneles de un sitio a otro, cambiar sus propiedades…En mi opnión aún no sabemos sacarle todo el jugo a los WebParts, pero nos convendría pensar en ellos como una posible propuesta a nuestros clientes. De hecho SharePoint aprovecha todas las funcionalidades de estos WebParts para la administración de sus sitios.<br /></p><p><a href='http://www.asp.net/learn/3.5-videos/video-43.aspx'>Aquí tienes el vídeo</a>, espero que te de algunas ideas de cómo utilizar los WebParts en tus aplicaciones.<br /></p><p><br /> </p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com2tag:blogger.com,1999:blog-1130962494515473064.post-17370339801547654792009-12-31T04:53:00.000+01:002014-11-17T01:34:29.685+01:00ASP.NET - Eventos de Controles de Usuario (ASCX)<span xmlns=''><p>El código completo del ejemplo lo puedes encontrar <a href='http://usercontrolevents.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38016'>aquí</a>.<br /></p><p>A la hora de crear controles de usuario solemos necesitar capturar un evento que se produce dentro del mismo, en la página padre. Además, normalmente, necesitaremos acceder a alguna de sus propiedades desde la página padre. En el ejemplo que os presento tenemos un control de usuario (un buscador) incrustado en una página que mostrará los resultados de la búsqueda.<br /></p><p>Para ello el control de usuario posee un evento que se lanza una vez la búsqueda ha finalizado, además, los resultados de dicha búsqueda se almacenan en una propiedad del control de usuario que recupera la página para mostrarlos en un GridView.<br /></p><p>Pasemos al código. El control de usuario, en su parte visual se compone únicamente de un TextBox (donde introducir el criterio de búsqueda) y un Button (que realiza la búsqueda).<br /></p><p><br /> </p><p style='text-align: center'><a href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj73jfleqPESUjtuwSY0V7Ue03YHwDWF65MZWHnHrQjnPjOMtdLDSFVi2rxFBUaMpXIYb26v4nZfF-zLSlMDGoy8C_yluHQlQEjShkNmQq5nbXFzOxVcj3oChRUyq0FqDTQl37_74zah-7O/s1600-h/aspnet_eventos_controles_usuario.PNG'><img border='0' alt='' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj73jfleqPESUjtuwSY0V7Ue03YHwDWF65MZWHnHrQjnPjOMtdLDSFVi2rxFBUaMpXIYb26v4nZfF-zLSlMDGoy8C_yluHQlQEjShkNmQq5nbXFzOxVcj3oChRUyq0FqDTQl37_74zah-7O/s320/aspnet_eventos_controles_usuario.PNG'/></a><br /> </p><p><br /> </p><p>La generación del evento se realiza desde el code-behind:<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>#region</span><span style='font-family:Courier New'> Eventos del control</span><br /> </span></p><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>public event</span><span style='font-family:Courier New'><br /> <span style='color:#2b91af'>EventHandler</span> AceptarClicked;</span><br /> </span></p><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>protected</span><span style='font-family:Courier New'><br /> <span style='color:blue'>virtual</span><br /> <span style='color:blue'>void</span> OnClick(<span style='color:blue'>object</span> sender)</span><br /> </span></p><p><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (<span style='color:blue'>this</span>.AceptarClicked != <span style='color:blue'>null</span>)<br /></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{<br /></span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.AceptarClicked(sender, <span style='color:blue'>new </span><span style='color:#2b91af'>EventArgs</span>());</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>}</span><br /> </span></p><p><span style='font-size:10pt'><span style='font-family:Courier New'>}</span><br /> </span></p><p><span style='color:blue; font-family:Courier New; font-size:10pt'>#endregion</span></p></td></tr></tbody></table></div><p><br /> </p><p>Este código declara el evento (cuyo nombre será AceptarClicked) e implementa el método que invoca el evento.<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>#region</span><span style='font-family:Courier New'> Propiedades publicas</span><br /> </span></p><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>private</span><span style='font-family:Courier New'><br /> <span style='color:#2b91af'>List</span><<span style='color:blue'>string</span>> resultados;</span><br /> </span></p><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>public </span><span style='color:#2b91af; font-family:Courier New'>List</span><span style='font-family:Courier New'><<span style='color:blue'>string</span>> Resultados</span><br /> </span></p><p><span style='font-size:10pt'><span style='font-family:Courier New'>{</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>get</span><span style='font-family:Courier New'> { <span style='color:blue'>return</span> resultados; }</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>set</span><span style='font-family:Courier New'> { resultados = <span style='color:blue'>value</span>; }</span><br /> </span></p><p><span style='font-size:10pt'><span style='font-family:Courier New'>}</span><br /> </span></p><p><span style='color:blue; font-family:Courier New; font-size:10pt'>#endregion</span></p></td></tr></tbody></table></div><p><br /> </p><p>El código anterior declara una propiedad pública dentro del control donde se almacenarán los resultados de la búsqueda.<br /></p><p>En el evento del botón del control de usuario realizamos la llamada al evento público que será capturado por la página:<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>protected</span><span style='font-family:Courier New'><br /> <span style='color:blue'>void</span> btnBuscar_Click(<span style='color:blue'>object</span> sender, <span style='color:#2b91af'>EventArgs</span> e)</span><br /> </span></p><p><span style='font-size:10pt'><span style='font-family:Courier New'>{</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:green; font-family:Courier New'>//Hardcode para simular una búsqueda</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.resultados = <span style='color:blue'>new</span><br/><span style='color:#2b91af'>List</span><<span style='color:blue'>string</span>>();</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>if</span><span style='font-family:Courier New'> (<span style='color:#2b91af'>String</span>.IsNullOrEmpty(<span style='color:blue'>this</span>.txtPalabraClave.Text))</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>{</span><br /> </span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.resultados.Add(<span style='color:#a31515'>"No se han encontrado resultados"</span>);</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>}</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>else</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>{</span><br /> </span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.resultados.Add(<span style='color:#a31515'>"Resultado1 para "</span> + <span style='color:blue'>this</span>.txtPalabraClave.Text);</span><br /> </span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.resultados.Add(<span style='color:#a31515'>"Resultado2 para "</span> + <span style='color:blue'>this</span>.txtPalabraClave.Text);</span><br /> </span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.resultados.Add(<span style='color:#a31515'>"Resultado3 para "</span> + <span style='color:blue'>this</span>.txtPalabraClave.Text);</span><br /> </span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.resultados.Add(<span style='color:#a31515'>"Resultado4 para "</span> + <span style='color:blue'>this</span>.txtPalabraClave.Text);</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>}</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:green; font-family:Courier New'>//Se invoca el evento público una vez la función del control ha terminado</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>OnClick(sender);</span><br /> </span></p><p><span style='font-family:Courier New; font-size:10pt'>}</span></p></td></tr></tbody></table></div><p><br /> </p><p>La página debe capturar el evento, esto se hace de igual forma que se captura el evento de un botón o cualquier control de .NET. Así, en la presentación de la página tendremos:<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>uc1</span><span style='color:blue'>:</span><span style='color:#a31515'>Buscador </span><span style='color:red'>ID</span><span style='color:blue'>="Buscador1"</span><br/><span style='color:red'>runat</span><span style='color:blue'>="server" </span><span style='color:red'>OnAceptarClicked</span><span style='color:blue'>="Buscador1_AceptarClicked"/></span></span></p></td></tr></tbody></table></div><p><br /> </p><p>Así el método de tratar el evento del control de usuario, dentro de la página padre será Buscador1_AceptarClicked y se codificará así:<br /></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>protected</span><span style='font-family:Courier New'><br /> <span style='color:blue'>void</span> Buscador1_AceptarClicked(<span style='color:blue'>object</span> sender, <span style='color:#2b91af'>EventArgs</span> e)</span><br /> </span></p><p><span style='font-size:10pt'><span style='font-family:Courier New'>{</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>if</span><span style='font-family:Courier New'> (<span style='color:blue'>this</span>.Buscador1.Resultados != <span style='color:blue'>null</span>)</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>{</span><br /> </span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.GridView1.DataSource = <span style='color:blue'>this</span>.Buscador1.Resultados;</span><br /> </span></p><p style='margin-left: 72pt'><span style='font-size:10pt'><span style='color:blue; font-family:Courier New'>this</span><span style='font-family:Courier New'>.GridView1.DataBind();</span><br /> </span></p><p style='margin-left: 36pt'><span style='font-size:10pt'><span style='font-family:Courier New'>}</span><br /> </span></p><p><span style='font-family:Courier New; font-size:10pt'>}</span></p></td></tr></tbody></table></div><p><br /> </p><p>El código completo del ejemplo lo puedes encontrar <a href='http://usercontrolevents.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38016'>aquí</a>.<br /></p><p>Y esto es todo, espero que te sirva</p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com7tag:blogger.com,1999:blog-1130962494515473064.post-21793116774909025922009-12-31T02:58:00.000+01:002014-11-17T01:34:29.690+01:00ASCX - Creación de Controles de Usuario<span xmlns=''><p>Una buena práctica, y en mi opinión necesaria para cualquier desarrollo Web, es plantearse qué secciones de las páginas de la aplicación se mostrarán en varias páginas. Estas secciones serán susceptibles de desarrollarse como controles de usuario (<a href='http://msdn.microsoft.com/en-us/library/y6wb1a0e(VS.85).aspx'>User Controls .NET</a>).<br /></p><p>Así, podríamos definir (a alto nivel) un control de usuario como una sección de una página que se repite en varias páginas. El hecho de crear un control de usuario nos evitará hacer Copy-Paste (tanto de la parte de presentación como del codebehind del control) de esta sección a lo largo de toda nuestra aplicación, además, a la hora de cambiar algo dentro de esta sección de la página, esta se encuentra en un solo punto y no en varias páginas de nuestra solución.<br /></p><p>Para añadir un control de usuario a nuestra sitio Web, botón derecho sobre nuestro proyecto -> Agregar Nuevo Elemento > Control de Usuario Web.<br /></p><p style='text-align: center'><br /> </p><p>En función del número de controles de usuario que preveamos que vamos a precisar convendrá pensar si debemos distribuirlos en carpetas dentro de nuestra solución. Yo normalmente creo una carpeta de "Controles" dentro de mi solución, donde voy almacenando mis controles de usuario.<br /></p><p>Bien, ya tenemos nuestro control de usuario en nuestra solución, <a href='http://autenticacionform.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37996'>aquí</a> puedes encontrar el ejemplo de una aplicación en que utilizo un control de usuario y será en esta solución en la que me base de aquí en adelante (en esta solución no he creado ninguna carpeta de controles ya que sólo tengo un control). Este control se corresponde con el menú de mi aplicación y, por tanto, se encontrará en todas las páginas y por ello está incluido en la página master de la solución. El código de mi ascx es el siguiente: <br /></p><p> <br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='background-color:yellow'><%</span><span style='color:blue'>@ </span><span style='color:#a31515'>Control </span><span style='color:red'>Language</span><span style='color:blue'>="C#" </span><span style='color:red'>AutoEventWireup</span><span style='color:blue'>="true"</span><br /> <span style='color:red'>CodeBehind</span><span style='color:blue'>="LoginControl.ascx.cs" </span><span style='color:red'>Inherits</span><span style='color:blue'>="AutenticacionFormulario.LoginControl" </span><span style='background-color:yellow'>%></span></span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>HyperLink </span><span style='color:red'>ID</span><span style='color:blue'>="HyperLink1" </span><span style='color:red'>runat</span><span style='color:blue'>="server" </span><span style='color:red'>Text</span><span style='color:blue'>="Inicio" </span><span style='color:red'>NavigateUrl</span><span style='color:blue'>="~/Default.aspx" /></span> | </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>HyperLink </span><span style='color:red'>ID</span><span style='color:blue'>="HyperLink2"</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"</span><br /> <span style='color:red'>Text</span><span style='color:blue'>="Administracion"</span><br /> <span style='color:red'>NavigateUrl</span><span style='color:blue'>="~/Admin/Admin.aspx" /></span> | </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>HyperLink </span><span style='color:red'>ID</span><span style='color:blue'>="HyperLink3"</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"</span><br /> <span style='color:red'>Text</span><span style='color:blue'>="Usuario"</span><br /> <span style='color:red'>NavigateUrl</span><span style='color:blue'>="~/User/User.aspx"</span><br /> <span style='color:blue'>/></span> | </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>HyperLink </span><span style='color:red'>ID</span><span style='color:blue'>="hyp1" </span><span style='color:red'>runat</span><span style='color:blue'>="server" </span><span style='color:red'>Text</span><span style='color:blue'>="Pagina segura" </span><span style='color:red'>NavigateUrl</span><span style='color:blue'>="~/Secure/Administracion.aspx"/></span> | </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>LoginView </span><span style='color:red'>ID</span><span style='color:blue'>="lv1"</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>AnonymousTemplate</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>Bienvenido, invitado</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>AnonymousTemplate</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>LoggedInTemplate</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>Bienvenido <span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>LoginName</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"</span><br /> <span style='color:red'>ID</span><span style='color:blue'>="ln1"</span><br /> <span style='color:red'>ForeColor</span><span style='color:blue'>="Green"</span><br /> <span style='color:red'>Font-Bold</span><span style='color:blue'>="true"</span><br /> <span style='color:blue'>/></span>,</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>LoggedInTemplate</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>LoginView</span><span style='color:blue'>><br /></span></span></p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>asp</span><span style='color:blue'>:</span><span style='color:#a31515'>LoginStatus</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"</span><br /> <span style='color:red'>id</span><span style='color:blue'>="ls1"</span><br /> <span style='color:blue'>/></span></span></p></td></tr></tbody></table></div><p> <br /> </p><p>Cómo puedes ver un Control de Usuario se codifica exactamente igual que una página ASPX.<br /></p><p>Para utilizar un Control de Usuario en una de tus páginas únicamente tendrás que arrastrarlo desde el "Explorador de Soluciones" hasta la página (esta debe estar abierta y en modo diseño). Esta acción generará lo siguiente en la página donde incluyes el control de usuario: <br /></p><p> <br /> </p><p>- Registro del control de usuario dentro de la página:<br /></p><p> <br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='background-color:yellow'><%</span><span style='color:blue'>@ </span><span style='color:#a31515'>Register</span><br /> <span style='color:red'>src</span><span style='color:blue'>="LoginControl.ascx"</span><br /> <span style='color:red'>tagname</span><span style='color:blue'>="LoginControl"</span><br /> <span style='color:red'>tagprefix</span><span style='color:blue'>="uc1"</span><br /> <span style='background-color:yellow'>%></span></span></p></td></tr></tbody></table></div><p> <br /> </p><p>- Inclusión del control de usuario en la página: <br /></p><p> <br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:580px'/></colgroup><tbody valign='top'><tr style='height: 2px'><td style='padding-top: 1px; padding-left: 6px; padding-bottom: 1px; padding-right: 6px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>uc1</span><span style='color:blue'>:</span><span style='color:#a31515'>LoginControl</span><br /> <span style='color:red'>ID</span><span style='color:blue'>="LoginControl1"</span><br /> <span style='color:red'>runat</span><span style='color:blue'>="server"</span><br /> <span style='color:blue'>/></span></span></p></td></tr></tbody></table></div><p> <br /> </p><p>Esto es todo no olvides pensar en crear controles de usuario, te facilitarán tanto el desarrollo como el mantenimiento de tus aplicaciones.</p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com0tag:blogger.com,1999:blog-1130962494515473064.post-77025077805291733222009-12-31T01:45:00.000+01:002014-11-17T01:34:29.715+01:00CSS - Cambiar la imagen del cursor<span xmlns=''><p>Esto no tiene que ver con .NET pero me ha surgido la duda de cómo hacerlo mientras navegaba por la web.<span style='font-family:Courier New; font-size:10pt'><br /> </span></p><p>Aunque en mi opinión el ratón es la herramienta fundamental del internauta y por tanto no conviene cambiar su imagen, el cambio de la imagen del cursor puede causar en el usuario una impresión de novedad.<span style='font-family:Courier New; font-size:10pt'><br /> </span></p><p>Es muy sencillo, sólo tenemos que añadir el siguiente código a nuestra página o a nuestra hoja de estilos CSS:<span style='font-family:Courier New; font-size:10pt'><br /> </span></p><p><br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:581px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 7px; padding-bottom: 1px; padding-right: 7px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>style</span><br /> <span style='color:red'>type</span><span style='color:blue'>="text/css"><br /></span></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:#a31515'>body</span>, <span style='color:#a31515'>a</span>, <span style='color:#a31515'>a:hover</span><br /> </span></p><p><span style='font-family:Courier New; font-size:10pt'>{<span style='color:red'>cursor</span>: <span style='color:blue'>url(http://cur.cursors-4u.net/anime/ani-10/ani973.ani),</span><br /> <span style='color:blue'>progress</span>;}<br /></span></p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>style</span><span style='color:blue'>></span></span></p></td></tr></tbody></table></div><p><br /> </p><p>En esta <a href='http://www.cursors-4u.com'>página</a> puedes encontrar muchos cursores.</p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com1tag:blogger.com,1999:blog-1130962494515473064.post-55834581603653945422009-12-30T20:01:00.000+01:002014-11-17T01:34:29.709+01:00ASP.NET Autenticación por Formulario (Parte II)<span xmlns=''><p>Puedes descargarte el ejemplo completo <a href='http://autenticacionform.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37996'>aquí</a>.<br /></p><p>En este post voy a explicar cómo manejar los roles de los usuarios con una autenticación basada en formularios.<br /></p><p>En mi anterior post <a href='http://csharp-experience.blogspot.com/2009/12/aspnet-autenticacion-por-formulario.html'>ASP.NET Autenticación por Formulario (Parte I)</a> explico cómo crear una aplicación cuya seguridad está basada en la autenticación por formulario, con una sección de administración. El paso siguiente dentro de la seguridad de un sitio Web es aplicar significado a los roles de usuario, para ello vamos a crear diferentes regiones seguras dentro de la aplicación en las que el usuario tendrá acceso en función de sus roles asignados. En esta ocasión la autenticación se realiza contra una base de datos, a la cual accedemos mediante queries LINQ (ya explicaré cómo utilizar LINQ para el acceso a datos en un próximo post).<br /></p><p>Voy a partir de la solución de mi anterior post que puedes descargar <a href='http://autenticacionform.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37864'>aquí</a>.<br /></p><p>He seguido lo siguientes pasos:<br /></p><p><span style='color:white'>1.- He añadido una base de datos a mi solución una base de datos</span>:<br /></p><p>- Botón derecho sobre el proyecto - >Agregar > Nuevo elemento.<br /></p><p>- Se selecciona "Base de Datos SQL Server".<br /></p><p style='text-align: center'><br/><a href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg182_YH3qKGtgq7jWre_9fcGx7_e2bv-LiR2nosm-HmPQzxyKcxrQQ82ekJ4ErGP8lDUev4Pya9MnEAUg2uORH7AZgBM686HieCW831TR4psxeQiez-RCZj2leGMtRM0HSv2-49bld-zRY/s1600-h/aspnet_autenticacion_formulario2.PNG'><img border='0' alt='' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg182_YH3qKGtgq7jWre_9fcGx7_e2bv-LiR2nosm-HmPQzxyKcxrQQ82ekJ4ErGP8lDUev4Pya9MnEAUg2uORH7AZgBM686HieCW831TR4psxeQiez-RCZj2leGMtRM0HSv2-49bld-zRY/s320/aspnet_autenticacion_formulario2.PNG'/></a><br /> </p><p><span style='color:white'>2.- He creado las siguientes tablas</span>:<br /></p><p>- USUARIO: Contiene todos los usuarios registrados en nuestro sistema. Tiene los siguientes campos: ID_USUARIO, LOGIN, PASSWORD<br /></p><p>- ROLE: Que contendrá todos los roles que necesita nuestra aplicación. Tiene los campos: ID_ROLE, DESCRIPCION.<br /></p><p>- ROLES_USUARIO: Mantiene la relación n:m entre los usuarios y sus roles, permitiendo que un usuario pueda tener varios roles.<br /></p><p>En el ejemplo que os presento existen dos roles (admin y user) y dos usuarios, así el usuario administrador tendrá todos los roles para poder acceder a todas las secciones de la aplicación.<br /></p><p> <br /> </p><p><span style='color:white'>3.- He agregado un Diagrama de Clases LINQ to SQL</span>.<br /></p><p>- Botón derecho sobre el proyecto -> Agregar > Nuevo elemento.<br /></p><p>- Se selecciona "Clases de LINQ to SQL".<br /></p><p><br /> </p><p>- Se rellena diagrama de clases LINQ (simplemente arrastrando la tabla desde el "Explorador de Servidores" hasta el diagrama de clases. Además he añadido las asociaciones entre las tablas obteniendo el resultado siguiente:<br /></p><p style='text-align: center'><a href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjreBio3u5bHq2lAAudpixHm-x8duQFzTqEXe-Rils1E0DpoFjaAbPx7SP_MkHl58QRvIm6iF8gZX1EznR3Aui5k0QxR_reUK7-gaKAEMKs1neqmw9Ui-fvZG8XnxkovNrerjeifMAF1ura/s1600-h/aspnet_autenticacion_formulario2c.PNG'><img border='0' alt='' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjreBio3u5bHq2lAAudpixHm-x8duQFzTqEXe-Rils1E0DpoFjaAbPx7SP_MkHl58QRvIm6iF8gZX1EznR3Aui5k0QxR_reUK7-gaKAEMKs1neqmw9Ui-fvZG8XnxkovNrerjeifMAF1ura/s320/aspnet_autenticacion_formulario2c.PNG'/></a><br /> </p><p>Se generarán así una serie de clases que nos permiten el acceso a la base de datos de una forma transparente, además de auto configurarse un ConnectionString.<br /></p><p><span style='color:white'>4.- Creación de clases ADO para el acceso a los datos</span>:<br /></p><p>- He creado dos clases, Rol y Usuario:<br /></p><p>La clase Rol está implementada así:<br /></p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:581px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 7px; padding-bottom: 1px; padding-right: 7px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>public class</span><br /> <span style='color:#2b91af'>Rol</span></span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>AutenticacionDataClassesDataContext</span> dc = <span style='color:blue'>new</span><span style='color:#2b91af'> AutenticacionDataClassesDataContext</span>();</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>const</span><br /> <span style='color:blue'>char</span> SI = <span style='color:#a31515'>'S'</span>;</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>internal void</span> AddRole (<span style='color:blue'>string</span> description)</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>ROLE</span> role = <span style='color:blue'>new</span><br /> <span style='color:#2b91af'>ROLE</span>();</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>role.DESCRIPCION = description;</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>dc.ROLE.InsertOnSubmit(role);</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>dc.SubmitChanges();</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>internal</span><br /> <span style='color:#2b91af'>ROLE</span> FindRol(<span style='color:#2b91af'>Guid</span>? codigoRole)</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>var</span> roles = <span style='color:blue'>from</span> u <span style='color:blue'>in</span> dc.ROLE</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>where</span> u.ID_ROLE == codigoRole</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>select</span> u;</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (roles.Count() > 0)</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>return</span> roles.First();</span><br /> </p><p style='margin-left: 72pt'><span style='color:blue; font-family:Courier New; font-size:10pt'>else</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>return null</span>;</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'>}</span></p></td></tr></tbody></table></div><p> <br /> </p><p>La clase Usuario tiene el siguiente código:<br /></p><p> <br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:581px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 7px; padding-bottom: 1px; padding-right: 7px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>public</span><br /> <span style='color:blue'>class</span><br /> <span style='color:#2b91af'>Usuario</span></span><br /> </p><p><span style='font-size:10pt'>{</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>AutenticacionDataClassesDataContext</span> dc = <span style='color:blue'>new </span><span style='color:#2b91af'>AutenticacionDataClassesDataContext</span>();</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>const char</span> SI = <span style='color:#a31515'>'S'</span>;</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>internal void</span> AddUsuario(<span style='color:blue'>string</span> login, <span style='color:blue'>string</span> password)</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>USUARIO</span> usuario = <span style='color:blue'>new </span><span style='color:#2b91af'>USUARIO</span>();</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>usuario.LOGIN = login; </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>usuario.PASSWORD = password; </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>dc.USUARIO.InsertOnSubmit(usuario); </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>dc.SubmitChanges();</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'> <span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>internal </span><span style='color:#2b91af'>USUARIO</span> FindUsuario(<span style='color:#2b91af'>Guid</span> codigoUsuario) </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>var</span> usu = <span style='color:blue'>from</span> u <span style='color:blue'>in</span> dc.USUARIO</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>where</span> u.ID_USUARIO == codigoUsuario</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>select</span> u; </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (usu.Count() > 0) </span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>return</span> usu.First();</span><br /> </p><p style='margin-left: 72pt'><span style='color:blue; font-family:Courier New; font-size:10pt'>else</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>return null</span>; </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>internal</span><br /> <span style='color:#2b91af'>USUARIO</span> FindUsuario(<span style='color:blue'>string</span> login, <span style='color:blue'>string</span> password) </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>var</span> usu = <span style='color:blue'>from</span> u <span style='color:blue'>in</span> dc.USUARIO</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>where</span> (u.LOGIN == login && u.PASSWORD == password) </span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>select</span> u; </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (usu.Count() > 0) </span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>return</span> usu.First();</span><br /> </p><p style='margin-left: 72pt'><span style='color:blue; font-family:Courier New; font-size:10pt'>else</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>return null</span>;</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>internal void</span> AddRole(<span style='color:#2b91af'>Guid</span> idUsuario, <span style='color:#2b91af'>Guid</span> idRole)</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>ROLES_USUARIO</span> rolesUsuario = <span style='color:blue'>new </span><span style='color:#2b91af'>ROLES_USUARIO</span>();</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>rolesUsuario.ID_ROLE = idRole;</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>rolesUsuario.ID_USUARIO = idUsuario;</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>dc.ROLES_USUARIO.InsertOnSubmit(rolesUsuario);</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>dc.SubmitChanges();</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>internal </span><span style='color:#2b91af'>List</span><<span style='color:#2b91af'>ROLE</span>> FindRolesUsuario(<span style='color:#2b91af'>Guid</span>? codigoUsuario) </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>List</span><<span style='color:#2b91af'>ROLE</span>> listRole = <span style='color:blue'>new</span><br/><span style='color:#2b91af'>List</span><<span style='color:#2b91af'>ROLE</span>>();</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>var</span> roles = <span style='color:blue'>from</span> u <span style='color:blue'>in</span> dc.ROLES_USUARIO</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>where</span> u.ID_USUARIO == codigoUsuario</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>select</span> u; </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (roles.Count() > 0) </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>IEnumerable</span><<span style='color:#2b91af'>ROLES_USUARIO</span>> rolesUsuario = roles.AsEnumerable<<span style='color:#2b91af'>ROLES_USUARIO</span>>();</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>foreach</span> (<span style='color:#2b91af'>ROLES_USUARIO</span> roleUusario <span style='color:blue'>in</span> rolesUsuario) </span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>Rol</span> rolADO = <span style='color:blue'>new</span><br/><span style='color:#2b91af'>Rol</span>();</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>ROLE</span> rol = rolADO.FindRol(roleUusario.ID_ROLE); </span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (rol != <span style='color:blue'>null</span>) </span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 180pt'><span style='font-family:Courier New; font-size:10pt'>listRole.Add(rol); </span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>return</span> listRole; </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'>}</span></p></td></tr></tbody></table></div><p> <br /> </p><p>He implementado algunos métodos que no necesitaré en esta versión, no prestéis especial atención a como están implementados, no creo que sirvan de referencia como uso de LINQ :D.<br /></p><p> <br /> </p><p><span style='color:white'>5.- Implementación de la autenticación de usuarios</span>:<br /></p><p> <br /> </p><p>Bien, una vez que tenemos listo nuestras clases de acceso a datos con los métodos que vamos a precisar para recuperar los usuarios y sus roles, podemos pasar a implementar la autenticación de los usuarios. He implementado el evento de autenticación de la siguiente forma:<br /></p><p> <br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:581px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 7px; padding-bottom: 1px; padding-right: 7px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>protected</span><br /> <span style='color:blue'>void</span> Login1_Authenticate(<span style='color:blue'>object</span> sender, <span style='color:#2b91af'>AuthenticateEventArgs</span> e) </span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> userName = Login1.UserName; </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> password = Login1.Password; </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>bool</span> rememberUserName = Login1.RememberMeSet; </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>Usuario</span> usuarioADO = <span style='color:blue'>new </span><span style='color:#2b91af'>Usuario</span>();</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>USUARIO</span> usuario = usuarioADO.FindUsuario(userName, password); </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (usuario != <span style='color:blue'>null</span>) </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>List</span><<span style='color:#2b91af'>ROLE</span>> roles = usuarioADO.FindRolesUsuario(usuario.ID_USUARIO); </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (roles != <span style='color:blue'>null</span>) </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> rolesData = <span style='color:#a31515'>""</span>;</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>foreach</span> (<span style='color:#2b91af'>ROLE</span> role <span style='color:blue'>in</span> roles) </span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'>rolesData += role.DESCRIPCION.ToString() + <span style='color:#a31515'>";"</span>;</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 108pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se crea el ticket de autenticación</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>FormsAuthenticationTicket</span> ticket = <span style='color:blue'>new </span><span style='color:#2b91af'>FormsAuthenticationTicket</span>(</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>1, <span style='color:green'>// Versión del ticket</span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>userName,<span style='color:green'>// Nombre de usuario asociado al ticket</span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>DateTime</span>.Now, <span style='color:green'>// Fecha de creación del ticket</span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>DateTime</span>.Now.AddMinutes(50), <span style='color:green'>// Fecha y Hora de las expiración de la cookie</span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>rememberUserName, <span style='color:green'>// Si el usuario cliquó en "Recuérdame" la cookie no expira.</span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>rolesData, <span style='color:green'>// Almacena datos del usuario, en este caso los roles</span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>FormsAuthentication</span>.FormsCookiePath); <span style='color:green'>// El path de la cookie especificado en el Web.Config</span></span><br /> </p><p style='margin-left: 108pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se encripta la cookie para añadir más seguridad</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> hashCookies = <span style='color:#2b91af'>FormsAuthentication</span>.Encrypt(ticket); </span><br /> </p><p style='margin-left: 108pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Cookie encriptada</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>HttpCookie</span> cookie = <span style='color:blue'>new</span><span style='color:#2b91af'> HttpCookie</span>(<span style='color:#2b91af'>FormsAuthentication</span>.FormsCookieName, hashCookies); </span><br /> </p><p style='margin-left: 108pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se añade la cookie a la respuesta</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>Response.Cookies.Add(cookie); </span><br /> </p><p style='margin-left: 108pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se recupera la url que el usuario trataba de acceder</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span> returnUrl = Request.QueryString[<span style='color:#a31515'>"ReturnUrl"</span>];</span><br /> </p><p style='margin-left: 108pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// si no existe dicha url redirigimos al usuario a la pagina por defecto</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (returnUrl == <span style='color:blue'>null</span>) returnUrl = <span style='color:#a31515'>"~/Default.aspx"</span>;</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>Response.Redirect(returnUrl); </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>else </span><span style='color:green'>// usuario y password erróneos</span></span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// no se hace nada, el control Login mostrará automáticament los errores</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'>}</span></p></td></tr></tbody></table></div><p> <br /> </p><p>Este código autentica a los usuarios contra nuestra base de datos y añade los roles del usuario.<br /></p><p> <br /> </p><p><span style='color:white'>6.- Creamos los directorios seguros en función de los roles</span>:<br /></p><p>Creamos los siguientes directorios:<br /></p><p> <br /> </p><p>- Admin: Destinado únicamente para usuarios administradores (usuarios con el rol 'admin').<br /></p><p>- User: Destinado a los usuarios del sitio (con el rol 'user'). P.e: Este directorio podría contener las páginas donde el usuario gestiona su propia cuenta<br /></p><p>Se securizan estos directorios modificando el Web.config de la siguiente forma:<br /></p><p> <br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:581px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 7px; padding-bottom: 1px; padding-right: 7px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>location </span><span style='color:red'>path</span><span style='color:blue'>=</span>"<span style='color:blue'>Admin</span>"<span style='color:blue'>></span></span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>system.web</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>authorization</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>allow </span><span style='color:red'>roles</span><span style='color:blue'>=</span>"<span style='color:blue'>admin</span>"<span style='color:blue'>/></span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>deny </span><span style='color:red'>users</span><span style='color:blue'>=</span>"<span style='color:blue'>*</span>"<span style='color:blue'> /></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>authorization</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>system.web</span><span style='color:blue'>></span></span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>location</span><span style='color:blue'>></span></span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>location </span><span style='color:red'>path</span><span style='color:blue'>=</span>"<span style='color:blue'>User</span>"<span style='color:blue'>></span></span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>system.web</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>authorization</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>allow </span><span style='color:red'>roles</span><span style='color:blue'>=</span>"<span style='color:blue'>user</span>"<span style='color:blue'>/></span></span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'><</span><span style='color:#a31515'>deny </span><span style='color:red'>users</span><span style='color:blue'>=</span>"<span style='color:blue'>*</span>"<span style='color:blue'>/></span></span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>authorization</span><span style='color:blue'>></span></span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>system.web</span><span style='color:blue'>></span></span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'></</span><span style='color:#a31515'>location</span><span style='color:blue'>></span></span></p></td></tr></tbody></table></div><p> <br /> </p><p><span style='color:white'>7.- Creamos control de usuario</span>:<br /></p><p>Este control de usuario se añade para poder hacer pruebas de nuestra autenticación y se añade a la página master de nuestra aplicación (Ah! Sí también creé una página master para que este control de usuario esté disponible en todas las páginas de nuestro sitio).<br /></p><p><br/><span style='color:white'>8.- Modificamos el fichero Global.asax (si no existiese lo agregaríamos)</span><br /> </p><p>En este fichero se añade la gestión de la autenticación de un usuario, en el siguiente código:<br /></p><p> <br /> </p><div><table border='0' style='border-collapse:collapse; background: white'><colgroup><col style='width:581px'/></colgroup><tbody valign='top'><tr><td style='padding-top: 1px; padding-left: 7px; padding-bottom: 1px; padding-right: 7px; border-top: dashed 0.5pt; border-left: dashed 0.5pt; border-bottom: dashed 0.5pt; border-right: dashed 0.5pt' vAlign='middle'><p><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>protected void</span> Application_AuthenticateRequest(<span style='color:blue'>object</span> sender, <span style='color:#2b91af'>EventArgs</span> e) </span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 36pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Si se envía alguna información acerca del usuario</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (<span style='color:#2b91af'>HttpContext</span>.Current.User != <span style='color:blue'>null</span>) </span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 72pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// se comprueba que el usuario esté autenticado</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (<span style='color:#2b91af'>HttpContext</span>.Current.User.Identity.IsAuthenticated) </span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 108pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se comprueba si el usuario está autenticado por formulario</span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>if</span> (<span style='color:#2b91af'>HttpContext</span>.Current.User.Identity <span style='color:blue'>is </span><span style='color:#2b91af'>FormsIdentity</span>) </span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>{</span><br /> </p><p style='margin-left: 144pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se recupera la identidad del usuario para recuperar sus roles</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>FormsIdentity</span> identity = (<span style='color:#2b91af'>FormsIdentity</span>)<span style='color:#2b91af'>HttpContext</span>.Current.User.Identity; </span><br /> </p><p style='margin-left: 144pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se recupera el ticket del usuario</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>FormsAuthenticationTicket</span> ticket = identity.Ticket; </span><br /> </p><p style='margin-left: 144pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se recupera la información acerca del usuario, donde metimos la información de los roles</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:blue'>string</span>[] roles = ticket.UserData.Split(<span style='color:#a31515'>';'</span>); </span><br /> </p><p style='margin-left: 144pt'><span style='color:green; font-family:Courier New; font-size:10pt'>// Se crea un usuario con dichos roles</span><br /> </p><p style='margin-left: 144pt'><span style='font-family:Courier New; font-size:10pt'><span style='color:#2b91af'>HttpContext</span>.Current.User = <span style='color:blue'>new</span> System.Security.Principal.<span style='color:#2b91af'>GenericPrincipal</span>(identity, roles); </span><br /> </p><p style='margin-left: 108pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 72pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p style='margin-left: 36pt'><span style='font-family:Courier New; font-size:10pt'>}</span><br /> </p><p><span style='font-family:Courier New; font-size:10pt'>}</span></p></td></tr></tbody></table></div><p> <br /> </p><p>¡Y esto es todo!<br /></p><p>Puedes descargarte el ejemplo completo <a href='http://autenticacionform.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37996'>aquí</a>.</p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com19tag:blogger.com,1999:blog-1130962494515473064.post-47286190685985828352009-12-28T12:33:00.000+01:002014-11-17T01:34:29.704+01:00ASP.NET Autenticación por Formulario (Parte I)<span xmlns=""><p>Puedes descargar el código <a href="http://autenticacionform.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37864">aquí</a>.<br /></p><p>En este post voy a explicar cómo crear una aplicación Web en la que existirá una sección segura. La autenticación vía formulario se suele utilizar para securizar el acceso a una determinada página (o grupo de páginas) a usuario no autenticados.<br /></p><p>Las páginas a las que deseas restringir el acceso pueden ser las páginas de administración de tu sitio Web. Sigue los pasos siguientes:<br /></p><p><br /> </p><p><span style="color:white;">Paso 1 - Creación de página de login:<br /></span></p><p>- Crea un nuevo proyecto desde Visual Studio (Sitio Web o Aplicación Web)<br /></p><p>- Añade una página "Login.aspx".<br /></p><p>- Agrega un control asp:login a la página "Login.aspx".<br /></p><p><br /> </p><p style="TEXT-ALIGN: center"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Ra2jahTzj90rPzEFJjlddtGefK0s1pnO67iU_E6I0F1umquarLL5RtNT3cQTPx_qIo7x1KzhoMEnmhCTy55TJ1xXf1uutG2FHaHfVwvdMZH_JL7pcCuotP2tFVKUpG9WNTkXTSXcyU0/s1600-h/aspnet_autenticacion_formulario1.PNG"><img alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Ra2jahTzj90rPzEFJjlddtGefK0s1pnO67iU_E6I0F1umquarLL5RtNT3cQTPx_qIo7x1KzhoMEnmhCTy55TJ1xXf1uutG2FHaHfVwvdMZH_JL7pcCuotP2tFVKUpG9WNTkXTSXcyU0/s320/aspnet_autenticacion_formulario1.PNG" border="0" /></a><br /></p><p style="TEXT-ALIGN: center"><br /> </p><p>- Implementación del evento Authenticate del control de Login.<br /></p><p><br /> </p><div><table style="BACKGROUND: white; BORDER-COLLAPSE: collapse" border="0"><colgroup><col style="WIDTH: 573px"></colgroup><tbody valign="top"><tr><td style="BORDER-RIGHT: 0.5pt dashed; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt dashed; PADDING-LEFT: 7px; PADDING-BOTTOM: 1px; BORDER-LEFT: 0.5pt dashed; PADDING-TOP: 1px; BORDER-BOTTOM: 0.5pt dashed" valign="center"><p><span style="font-family:Courier New;font-size:9;"><span style="color:blue;">protected</span><br /><span style="color:blue;">void</span> Login1_Authenticate(<span style="color:blue;">object</span> sender, <span style="color:#2b91af;">AuthenticateEventArgs</span> e)<br /></span></p><p><span style="font-family:Courier New;font-size:9;">{<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;"><span style="color:blue;">bool</span> authenticated = AuthenticateMe(Login1.UserName, Login1.Password, Login1.RememberMeSet);<br /></span></p><p><span style="font-family:Courier New;font-size:9;"><br /><span style="color:blue;">if</span> (authenticated)<br /></span></p><p><span style="font-family:Courier New;font-size:9;">{<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;"><br /><span style="color:#2b91af;">FormsAuthentication</span>.RedirectFromLoginPage(Login1.UserName, Login1.RememberMeSet);<br /></span></p><p><span style="font-family:Courier New;font-size:9;">}<br /></span></p><p><span style="font-family:Courier New;font-size:9;">}<br /></span></p><p><span style="font-family:Courier New;font-size:9;"><span style="color:blue;">private</span><br /><span style="color:blue;">bool</span> AuthenticateMe(<span style="color:blue;">string</span> userName, <span style="color:blue;">string</span> password, <span style="color:blue;">bool</span> rememberUserName)<br /></span></p><p><span style="font-family:Courier New;font-size:9;">{<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;color:green;">//Se trata de un hardcode, en un caso real la validación se hará contra una base de datos<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;"><span style="color:blue;">string</span> localUserName = <span style="color:#a31515;">"admin"</span>;<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;"><span style="color:blue;">string</span> localPassword = <span style="color:#a31515;">"1234"</span>;<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;"><span style="color:blue;">if</span> (userName.Equals(localUserName) && password.Equals(localPassword))<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;">{<span style="color:blue;">return true</span>;}<br /></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:9;"><span style="color:blue;">else</span>{<span style="color:blue;">return false</span>;}<br /></span></p><p><span style="font-family:Courier New;font-size:9;">}</span></p></td></tr></tbody></table></div><p><br /> </p><p><span style="color:white;">Paso 2 - Modificación del Web.config:<br /></span></p><p>- En este paso se modifica el Web.config para indicar la url por defecto del sitio (<strong>defaultUrl</strong>), la url de la página de login (<strong>loginUrl</strong>), se indica si la sesión segura espira (<strong>slidingExpiration</strong>) y el <strong>timeout</strong> en minutos.<br /></p><p><br /> </p><div><table style="BACKGROUND: white; BORDER-COLLAPSE: collapse" border="0"><colgroup><col style="WIDTH: 581px"></colgroup><tbody valign="top"><tr><td style="BORDER-RIGHT: 0.5pt dashed; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt dashed; PADDING-LEFT: 7px; PADDING-BOTTOM: 1px; BORDER-LEFT: 0.5pt dashed; PADDING-TOP: 1px; BORDER-BOTTOM: 0.5pt dashed" valign="center"><p><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">system.web</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">authentication</span><span style="color:blue;"><br /></span><span style="color:red;">mode</span><span style="color:blue;">=</span>"<span style="color:blue;">Forms</span>"<span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">forms</span><span style="color:blue;"><br /></span><span style="color:red;">defaultUrl</span><span style="color:blue;">=</span>"<span style="color:blue;">default.aspx</span>"<span style="color:blue;"><br /></span><span style="color:red;">loginUrl</span><span style="color:blue;">=</span>"<span style="color:blue;">~/login.aspx</span>"<span style="color:blue;"><br /></span><span style="color:red;">slidingExpiration</span><span style="color:blue;">=</span>"<span style="color:blue;">true</span>"<span style="color:blue;"><br /></span><span style="color:red;">timeout</span><span style="color:blue;">=</span>"<span style="color:blue;">20</span>"<span style="color:blue;">></</span><span style="color:#a31515;">forms</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"></</span><span style="color:#a31515;">authentication</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">authorization</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"></</span><span style="color:#a31515;">authorization</span><span style="color:blue;">><br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"></</span><span style="color:#a31515;">system.web</span><span style="color:blue;">></span></span></p></td></tr></tbody></table></div><p><br /> </p><p><span style="color:white;">Paso 3 - Creación de un directorio seguro:<br /></span></p><p>Dentro de este directorio se encontrarán aquellas páginas cuyo acceso se quiere restringir.<br /></p><p>- Crea una nueva carpeta dentro de tu proyecto (p.e: Secure).<br /></p><p>- Dentro de este directorio añade una página (p.e: Administracion.aspx).<br /></p><p>- Añade un Web.config dentro de esta carpeta e incluye el siguiente contenido en el mismo.<br /></p><p><br /> </p><div><table style="BACKGROUND: white; BORDER-COLLAPSE: collapse" border="0"><colgroup><col style="WIDTH: 581px"></colgroup><tbody valign="top"><tr><td style="BORDER-RIGHT: 0.5pt dashed; PADDING-RIGHT: 7px; BORDER-TOP: 0.5pt dashed; PADDING-LEFT: 7px; PADDING-BOTTOM: 1px; BORDER-LEFT: 0.5pt dashed; PADDING-TOP: 1px; BORDER-BOTTOM: 0.5pt dashed" valign="center"><p><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><?</span><span style="color:#a31515;">xml </span><span style="color:red;">version</span><span style="color:blue;">=</span>"<span style="color:blue;">1.0</span>" <span style="color:red;">encoding</span><span style="color:blue;">=</span>"<span style="color:blue;">utf-8</span>"<span style="color:blue;">?><br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">configuration</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">appSettings</span><span style="color:blue;">/><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">connectionStrings</span><span style="color:blue;">/><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">system.web</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 72pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">authorization</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 108pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"><</span><span style="color:#a31515;">deny </span><span style="color:red;">users</span><span style="color:blue;">=</span>"<span style="color:blue;">?</span>"<span style="color:blue;">/><br /></span></span></p><p style="MARGIN-LEFT: 72pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"></</span><span style="color:#a31515;">authorization</span><span style="color:blue;">><br /></span></span></p><p style="MARGIN-LEFT: 36pt"><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"></</span><span style="color:#a31515;">system.web</span><span style="color:blue;">><br /></span></span></p><p><span style="font-family:Courier New;font-size:10;"><span style="color:blue;"></</span><span style="color:#a31515;">configuration</span><span style="color:blue;">></span></span></p></td></tr></tbody></table></div><p><br /> </p><p><span style="color:white;">Paso 4 - Ejecuta tu aplicación:<br /></span></p><p>Selecciona la página Administracion.aspx como página de inicio y pulsa F5. Serás redireccionado a la página de Login, una vez hayas introducido las credenciales correctas, la página de login re redireccionará hasta la página de Administracion.aspx<br /></p><p>Puedes descargar el código <a href="http://autenticacionform.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=37864">aquí</a>.<br /></p></span>Anonymoushttp://www.blogger.com/profile/05161700664581625365noreply@blogger.com5