Kamil Kliczbor @ asptip.net

26Nov/102

Odświeżamy certifikat: upgrade certifikatu MCDP Web Developer z .NET 2.0 do .NET 4

Możliwe ścieżki migracji

Jak to mówią - Przyszła kryska na Matyska. Stary zaśniedziały i zardzewiały certyfikat MCPD Web Developer we Frameworku 2.0 wypadałoby uaktualnić do najnowszej wersji. Migracja nie jest wygodna, ponieważ możliwe ścieżki zakładają zdanie co najmniej dwóch egzaminów (link z pytaniem o migrację znajduje się tutaj).

Pierwsza ścieżka, która polega na zdaniu dwóch egzaminów wymaga podejścia do następujących sprawdzianów wiedzy:

  1. Exam 70-567: UPGRADE: Transition your MCPD Web Developer Skills to MCPD ASP.NET Developer 3.5
  2. Exam 70-523: Upgrade: Transition your MCPD .NET Framework 3.5 Web Developer Skills to MCPD .NET Framework 4 Web Developer

Z tym, że ostatni egzamin został udostępniony stosunkowo niedawno, tj. 22 października 2010.

Druga opcja polega po prostu na podjęciu standardowej ścieżki dla .NET Frameworka w wersji 4. Obejmuje on przystąpienie do serii następujących egzaminów:

  1. Exam 70-515: TS: Web Applications Development with Microsoft .NET Framework 4
  2. Exam 70-513: TS: Windows Communication Foundation Development with Microsoft .NET Framework 4
  3. Exam 70-516: TS: Accessing Data with Microsoft .NET Framework 4
  4. Exam 70-519: Pro: Designing and Developing Web Applications Using Microsoft .NET Framework 4

Jak widać różnica polega na ilości zdawanych egzaminów, co bezpośrednio przekłada się na koszta z tym związane oraz czas spędzony w centrum certyfikacyjnym. Ponieważ w tym momencie potrzebny mi jest MCPD z aplikacji webowych, będę dążyć do uzyskania upgradu korzystając z pierwszej ścieżki. Dodatkowo przemawiającym do mnie argumentem jest to, że nie ma wystarczającej ilości materiałów przygotowujących do egzaminów w postaci Self Paced Training Kitów w .NET Framework 4 na ten moment.

Książkowe materiały dydaktyczne

No i tutaj zaczynają się schody. Generalnie w przypadku migracji z .NET 2.0 na 3.5 oraz 3.5 do 4 nie istnieją Preparation Kity przygotowujące do egzaminu 70-567 i 70-523. Jedynym sensownym rozwiązaniem jest skorzystanie z materiałów przygotowanych bezpośrednio pod egzaminy MCTS-owe i MCPD-kowe z 3.5, czyli:

W przypadku MCPD-ka na 3.5 wydawnictwo Microsoft Press pokusiło się o wydanie książki przygotowującej do egzaminu, jednakże nie jest ona już w sprzedaży (? informacje z jakiegoś forum msdn) (na amazonie jest jeszcze dostępna). Być może z powodu złej opinii o książce została ona wycofana z druku.

Inna alternatywa polega na korzystaniu z książek z wydawnictw WROX-a, APRESS-a czy innych. Jednakże nie przygotowują one wprost do egzaminu. A wiadomo, że lepiej jest przeczytać książke pod egzamin niż zawierającą ogólną wiedzę.

Gdzie szukać materiałów w sieci?

Nie pozostaje nic innego jak przeszukać sieć pod kątem dostępnych informacji. Najwięcej materiałów znaleźć można oczywiście na MSDN-ie, jednakże przedstawiam poniżej kilka przydatnych linków, które raczej mogą bardziej pomóc niż zaszkodzić.

Nowe funkcjonalności w relacji 2.0 - 3.5:

Nowe funkcjonalności w relacji .NET 3.5 - 4.

Podsumowanie

Dużo, dużo jest do ogarnięcia. W szczególności, że w zakres MCPD-ka dla .NET 4 dochodzi WCF, ADO.NET i ASP.NET MVC. Dla programisty, który obraca się wokół tych tematów, zakres materiału nie będzie  trudny do zrozumienia. Trudności pojawią się raczej w zapamiętaniu i utrwaleniu tych informacji w ilości wystarczającej do podejścia i zdania egzaminu. W szczególności, że ASP.NET MVC to zcela nové.

A teraz już tylko: Do pracy rodacy!

20Nov/100

Krótka historia: jquery.validate + WebForms + zewnętrzy plik js

Jak do tego doszło ?

Post ten powstał z inicjatywy kolegi zadającego pytanie zadane na forum http://codeguru.pl/frmThread.aspx?tid=100619. Odpowiadając mu wydawało mi się, że rozwiązanie jest na tyle oczywiste, ze nie wymaga mojej "interwencji" w jego kod. Wszakże kod to rzecz święta :). Jednak późniejsze boje wykazały, że nie wszystko jest takie oczywiste jak się wydawać mogło na pierwszy rzut oka. Temat oczywiście dotyczy utworzenia standardowej stronki w WebForms-ach, która ma być walidowana przez plugin do jquery - jquery.validate.

Przypadek trywialny: skrypt inline na stronie

W necie przykładów do takiego podejścia można znaleźć na prawdę wiele. Po krótkiej chwili w mojej przeglądarce wylądowało ponad 10 różnych stronek, gdzie podawane przykłady aż biły prostotą. Poniżej umieszczam te linki jeżeli ktoś ma może ochotę sobie popatrzeć jakie istnieją rozwiązania do tego zagadnienia:

  • http://www.dotnetcurry.com/ShowArticle.aspx?ID=310&AspxAutoDetectCookieSupport=1
  • http://jquery.bassistance.de/validate/demo/milk/
  • http://www.webreference.com/programming/javascript/jquery/form_validation/
  • http://stackoverflow.com/questions/1232641/jquery-validate-js-and-asp-net-master-pages
  • http://codeclimber.net.nz/archive/2008/05/14/how-to-manage-asp.net-validation-from-javascript-with-jquery.aspx
  • http://www.theaspnetguy.com/theaspnetguy_root/post/2009/05/25/JQuery-Validate-plugin-to-validate-a-ASPNET-Form.aspx

Przypadek rozszerzony : skrypt w pliku zewnętrznym

No i sprawa zaczęła się komplikować, kiedy trzeba było w elegancki sposób przesunąć skrypt javascript'owy do pliku zewnętrznego. Po kilku chwilach walki, z pomocą następujących wskazówek rozwiązałem problem:

  • http://stackoverflow.com/questions/1232465/
  • http://stackoverflow.com/questions/619816/jquery-validation-plugin-in-asp-net-web-forms
  • http://www.west-wind.com/WebLog/posts/252178.aspx
  • http://docs.jquery.com/Plugins/Validation/rules#.22add.22rules

Główny problem tego zadania polegał w gruncie rzeczy na tym, żeby w jakiś sensowny sposób przekazać identyfikatory inputów do skryptu walidującego. O ile samo wydobycie nazwy kontrolki po stronie klienta np. TextBoxa nie było trudne - <%=tbUserName.ClientId %>, o tyle przypięcie tych idków do jquery.validate wymagało większej gimnastyki.

Rozwiązanie

Zewnętrzny plik JavaScript:

var RegisterForm = {
    _controlsNames: new Array(),
    _registerForm: '',

    set_controlsNames: function (value) {
        RegisterForm._controlsNames = value;
    },

    set_registerForm: function (value) {
        RegisterForm._registerForm = value;
    },

    init: function () {

        $("#" + RegisterForm._registerForm).validate();

        $('#' + RegisterForm._controlsNames.user).rules('add', {
            required: true,
            minlength: 2,
            messages: {
                required: "* Required Field *",
                minlength: "* Please enter at least 2 characters *"
            }
        });

        $('#' + RegisterForm._controlsNames.email).rules('add', {
            required: true,
            email: true,
            messages: {
                required: "* Required Field *"
            }
        });
    }
}

Plik formularza:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="JQueryValidation._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>
        Formularz i walidacja z jquery.validate
    </h2>
    <asp:Label AssociatedControlID="RegisterUser" Text="Użytkownik:" runat="server"/>
    <asp:TextBox ID="RegisterUser" runat="server" /><br />
    <asp:Label AssociatedControlID="RegisterEmail" Text="Email:" runat="server"/><asp:TextBox ID="RegisterEmail"
        runat="server" />
    <br />
    <asp:Button ID="RegisterButton" runat="server" Text="Rejestruj" CausesValidation="False" />
    <script src="Scripts/jquery.validate.js" type="text/javascript"></script>
    <script src="Scripts/register.js" type="text/javascript"></script>
    <script type="text/javascript">
    //<![CDATA[
        $(function () {
            var controlsToValidate = {
                user: "<%= RegisterUser.ClientID %>",
                email: "<%= RegisterEmail.ClientID %>"
            };

            RegisterForm.set_controlsNames(controlsToValidate);
            RegisterForm.set_registerForm("<%= this.Master.Page.Form.ClientID %>");
            RegisterForm.init();
        });
    //]]>
    </script>
</asp:Content>

Dla bardziej dociekliwych umieszczam również spakowany projekt.