<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BigBasti&#039;s Blog &#187; Microsoft</title>
	<atom:link href="http://blog.bigbasti.com/category/microsoft/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bigbasti.com</link>
	<description>About Me &#38; my Digital Lifestyle</description>
	<lastBuildDate>Wed, 25 Jan 2012 12:31:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Benutzerregistrierung mit ASP.NET MVC und jQuery Teil 1</title>
		<link>http://blog.bigbasti.com/benutzerregistrierung-mit-asp-net-mvc-und-jquery-teil-1/</link>
		<comments>http://blog.bigbasti.com/benutzerregistrierung-mit-asp-net-mvc-und-jquery-teil-1/#comments</comments>
		<pubDate>Sun, 08 May 2011 21:12:29 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1676</guid>
		<description><![CDATA[Wer heute Webanwendungen erstellt kommt einfach nicht drumherum JavaScript zu verwenden um dem Benutzer zb. die Eingabe von Daten in ein Formular zu erleichtern und zB. Hinweise während der Eingabe anzuzeigen.

Leider ist JavaScript bei vielen nicht wirklich beliebt und die meisten versuchen wann immer es geht darauf zu verzichten, und das auch aus guten ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://server.bigbasti.com/uploads/uploads/13211853559776894.png "><img class="alignleft" src="http://server.bigbasti.com/uploads/uploads/13211853559776894.png " alt="" width="227" height="56" /></a>Wer heute Webanwendungen erstellt kommt einfach nicht drumherum JavaScript zu verwenden um dem Benutzer zb. die Eingabe von Daten in ein Formular zu erleichtern und zB. Hinweise während der Eingabe anzuzeigen.</p>
<p>Leider ist JavaScript bei vielen nicht wirklich beliebt und die meisten versuchen wann immer es geht darauf zu verzichten, und das auch aus guten Gründen, denn ähnlich wie mit dem HTML Standard arbeiten die verschiedenen Browser in einigen Bereichen etwas eigenwillig, das kann einen schon mal zur Verzweifelung treiben.</p>
<p>Das haben sich auch viele andere gedacht und so gibt es inzwischen viele Frameworks die dem Entwickler viel Arbeit abnehmen und sich um diese fiesen Sachen wie die Kompabilität zu Browsern kümmern. In meinem Beispiel hier möchte ich euch das JavaScript Framework <a href="http://http://jquery.com/">jQuery </a>vorstellen.</p>
<p><strong>Warum jQuery?</strong></p>
<p>jQuery ist inzwischen in der Version 1.5.1 verfügbar und ist kompatibel zu allen Browsern, desweiteren ist die Community sehr groß und es existieren hunderte von Plugins die ich nutzen könnt. Aber die wirklich guten Gründe sind, dass es über eine sehr sehr gute Dokumentation verfügt, alle Browser inklusive des IE9 unterstützt und offiziell von Microsoft supportet wird. Wenn ihr also beispielsweise ein neues ASP.NET (MVC) Projekt erstellt werdet ihr feststellen, dass ihr im Scripts-Ordner bereits die jQuery Scripte hinterlegt habt.</p>
<p><strong>Was macht dieses Framework eigentlich?</strong></p>
<p>jQuery wie der Name es schon sagt zeigt seine ganze Stärke in der Auswahl bzw. der Selektion von Webseitenelementen im <a href="http://de.wikipedia.org/wiki/Document_Object_Model">DOM</a>, so kann man mit einfachen Einzeilern ganze Webseiten-Bereiche modifizieren. Außerdem bietet jQuery Funktionen die man häufig nutzt wie zB. Asynchrone Ajax aufrufe oder Animationen von Feldern. Aber gut kommen wir zu unserem Beispiel.</p>
<p><strong>Unser Beispiel</strong></p>
<p>Als Beispiel möchte ich hier ein einfaches Registrierungsformular erstellen, dass wir dann mit jQuery aufwerten wollen. Dabei möchte ich hier den manuellen Weg gehen und nicht die in ASP.NET MVC3 integrierten Methoden nutzen, eventuell können wir ja ein einem zweiten Teil dann den anderen Weg darstellen.</p>
<p>Beginnen wir erstmal mit dem Model. Da wir unsere Registrierung simpel halten wollen muss der Benutzer nur drei Angaben machen, nämlich seinen Namen, Email Adresse und ein Passwort. Normalerweise würden wir unser model hier ca so gestalten:</p>
<pre>
<pre class="brush: csharp; ">

public class RegisterModel {

    [Required]
    [DisplayName(&quot;Benutzername&quot;)]
    [Remote(&quot;CheckUserName&quot;, &quot;Validation&quot;)]
    public String UserName { get; set; }

    [Required]
    [DisplayName(&quot;E-Mail Adresse&quot;)]
    [DataType(DataType.EmailAddress)]
    [Remote(&quot;CheckUserEmail&quot;, &quot;Validation&quot;)]
    public String UserMail { get; set; }

    [Required]
    [DisplayName(&quot;Passwort&quot;)]
    [Remote(&quot;CheckUserNPassword&quot;, &quot;Validation&quot;)]
    public String UserPass { get; set; }

    [Required, Compare(&quot;UserPass&quot;)]
    [DisplayName(&quot;Passwort wiederholen&quot;)]
    public String UserPass2 { get; set; }
}
</pre>
</pre>
<p>Da wir das aber selber machen wollen und teils clientseitig validieren wollen schwächen wir das mal etwas ab und nehmen alles raus bis auf das DisplayName Attribut:</p>
<pre>
<pre class="brush: csharp; ">

public class RegisterModel {
    [DisplayName(&quot;Benutzername&quot;)]
    public String UserName { get; set; }

    [DisplayName(&quot;E-Mail Adresse&quot;)]
    public String UserMail { get; set; }

    [DisplayName(&quot;Passwort&quot;)]
    public String UserPass { get; set; }

    [DisplayName(&quot;Passwort wiederholen&quot;)]
    public String UserPass2 { get; set; }
}
</pre>
</pre>
<p>So, nachdem wir das Model nun fertig haben, bauen wir das Projekt ein Mal und erstellen unsere View. Hier habe ich eine simple Tabelle angefertigt, die die nötigen Form-Elemente beinhaltet, die der Benutzer ausfüllen soll:</p>
<pre>
<pre class="brush: html; ">

&lt;div id=&quot;register_form&quot;&gt;

&lt;div id=&quot;headline&quot;&gt;Registrierung&lt;/div&gt;

�
&lt;form id=&quot;registration_form&quot; action=&quot;/Register&quot; method=&quot;post&quot;&gt;

&lt;table border=&quot;1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@Html.LabelFor(model =&gt; model.UserName):&lt;/td&gt;
&lt;td&gt;@Html.TextBoxFor(model =&gt; model.UserName)&lt;/td&gt;
&lt;td&gt;&lt;span id=&quot;UserName_error&quot;&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@Html.LabelFor(model =&gt; model.UserMail):&lt;/td&gt;
&lt;td&gt;@Html.TextBoxFor(model =&gt; model.UserMail)&lt;/td&gt;
&lt;td&gt;&lt;span id=&quot;UserMail_error&quot;&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@Html.LabelFor(model =&gt; model.UserPass):&lt;/td&gt;
&lt;td&gt;@Html.TextBoxFor(model =&gt; model.UserPass)&lt;/td&gt;
&lt;td&gt;&lt;span id=&quot;UserPass_error&quot;&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;@Html.LabelFor(model =&gt; model.UserPass2):&lt;/td&gt;
&lt;td&gt;@Html.TextBoxFor(model =&gt; model.UserPass2)&lt;/td&gt;
&lt;td&gt;&lt;span id=&quot;UserPass2_error&quot;&gt; &lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;input id=&quot;submit_form_button&quot; type=&quot;submit&quot; value=&quot;Registrierung abschicken&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

�
&lt;/form&gt;

�
&lt;/div&gt;
</pre>
</pre>
<p>Hier benutze ich die neue Razor Syntax von ASP.NET MVC3 falls ihr damit noch nicht vertraut seid könnt ihr<a href="http://blog.bigbasti.com/asp-net-mvc3-was-gibts-neues/">hier mal gucken.</a></p>
<div>
<dl>
<dt><img src="http://server.bigbasti.com/uploads/uploads/1321112466848754.png " alt="" width="357" height="211" /></dt>
<dd>So sieht das Beispielformular aus</dd>
</dl>
</div>
<p>Die erste Spalte enthält hier jeweils die Beschreibung des Feldes, die zweite das Input-Element und die Dritte ist für die Anzeige von Fehlern zuständig, zu Beginn aber leer!</p>
<p><strong>Der jQuery Part</strong></p>
<p>So weit so gut, nun haben wir eigentlich schon alles was wir benötigen, und wenn wir nun nicht die Absicht hätten JavaScript zu benutzen wären wir an dieser Stelle schon fertig, müssten nur noch den Controller Part implementieren und könnten alles zu den Akten legen. Aber wir wollen dem Benutzer hier eine möglichsts angenehme Erfahrung bieten, denn vielleicht habt ihr es schon selbst erlebt und musstet euch auf einer Seite anmelden wo die Anmeldung ein Krampf war, das kann einem schon mal den einen oder anderen User kosten!</p>
<p><strong>Was wollen wir hier nun also verbessern?</strong></p>
<ul>
<li>Wenn der Benutzer einen Benutzernamen eingibt prüft das System im Hintergrund automatisch ob dieser Name schon vergeben ist und markiert das Eingabe Feld entsprechend.</li>
<li>Nach der Eingabe der Email-Adresse wird diese automatisch geprüft nach Format und Verfügbarkeit und der Benutzer bekommt signalisiert ob damit alles in Ordnung ist, natürlich alles im Hintergrund</li>
<li>Wenn der Benutzer sein Passwort wählt prüften wir ob dessen Stärke für uns ausreicht und ob beide Passwortfelder auch das gleiche Passwort beinhalten</li>
<li>Der Absenden-Button wird erst anklickbar, nachdem alle Felder so ausgefüllt sind wie wir es uns vorstellen</li>
</ul>
<p>Alles das können wir dank jQuery sehr einfach erreichen. Fangen wir mal vorne mit Punkt 1 an.</p>
<p>Erst ein mal zu dem allgemeinen Ablauf, wie soll das Ganze funktionieren?</p>
<ol>
<li>Also der Benutzer tippt seinen Wunschnamen ein,</li>
<li>und wechselt aus dem Benutzername-Eingabefeld.</li>
<li>Nun soll unsere Webseite den eingegebenen Wert nehmen, und diesen an den Server senden</li>
<li>Der Server prüft den Namen auf Verfügbarkeit oder Form und Verbotene Zeichen etc</li>
<li>Und sendet eine Information zurück. Diese Information ist entweder ein Fehler oder eine Erfolgsmeldung</li>
<li>Je nachdem ob ein Erfolg oder ein Fehler vermeldet wird wird eine Fehlermeldung angezeigt und das Eingabefeld markiert</li>
</ol>
<p>Klingt doch eigentlich ganz logisch! Fangen wir an. Erst einmal benötigen wir die jQuery Scriptdatei, diese bekommen wir direkt auf der Startseite von <a href="http://www.jquery.com" target="_blank">www.jquery.com</a> Rechts oben auf der Startseite könnt ihr zwischen der Production und der Development Version wählen. Der unterschied besteht nur darin, dass die Production Version stark komprimiert ist und somit weniger Traffic verursacht, wenn ihr recht frisch seit was jQuery und javascript angeht solltet ihr euch die Development Version laden, da diese besser zu debuggen ist!</p>
<p>Nachdem ihr das Script geladen habt müssen wir das in unser Projekt einbinden. Zieht die js-Datei einfach aus dem Windows Explorer per Drag &amp; Drop in euer Scripts-Ordner im Projekt Explorer. Nun fügen wir noch die Referenz auf die Datei hinzu, das machen wir am besten in der _Layout Datei die im Shared-Verzeichnis des View Verzeichnisses liegt. Hier ist wahrscheinlich schon ein Verweis auf ein jQuery Script vorhanden, ihr müsst nur noch den Pfad anpassen:</p>
<pre>
<pre class="brush: html; ">

&lt;script src=&quot;@Url.Content(&quot;~/Scripts/jquery.1.5.1.min.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
</pre>
<p>Diese _Layout Datei wird automatisch in alle unsere Views eingebunden (zur Laufzeit), deswegen müssen wir den Verweis  nur an dieser Stelle einfügen, praktisch oder?</p>
<p>Nachdem das geschafft ist können wir uns dem eigentlichen Teil widmen. Wechseln wir also wieder zurück zu unserem Login Formular und machen uns an unseren Punkt 1.</p>
<p>Bevor wir starten möchte ich hier nochmal kurz erwähnen, dass das ein Anfänger Tutorial ist und wir die Kommunikation mit dem Server sehr einfach gestalten werden, eventuell werde ich dann noch einen weiteren Teil machen in dem wir die Kommunikation mit JSON realisieren.</p>
<p><strong>Fangen wir an</strong></p>
<p>JQuery ist nichts anderes als Javascript, ihr habt sicherlich auch schon Javascript Dateien erstellt und diese dann in eure Webseiten eingebunden, hier machen wir nichts anderes, ihr könnt ja auch einfach in die jQuery Datei reinschauen, es ist "nur" javascript.</p>
<p>Wenn wir Funktionen von jQuery benutzen wollen können wir das tun in dem wir das Dollarzeichen benutzen "$" oder jQuery ausschreiben, so funktioniert beides:</p>
<pre>
<pre class="brush: javascript; ">

    $.ajax(...);
    jQuery.ajax(...);
</pre>
</pre>
<p>Ich nutze nur die $-Schreibweise, einfach nur weil es kürzer ist, es ist jedoch euch überlassen was ihr lieber mögt.</p>
<p>Mit jQuery ist sehr einfach Seitenelemente im DOM auszuwählen, so genügt eine einfache Angabe der Klasse, ID oder des Elementen-Typs um diese auszuwählen. Hier ein paar Beispiele:</p>
<pre>
<pre class="brush: javascript; ">

&lt;script type=&quot;text/javascript&quot;&gt;
    //Wählt das Element mit der ID username aus und setzt die Hintergrundfarbe auf rot
    $(&#039;#username&#039;).css(&#039;background-color&#039;, &#039;red&#039;);

    //Wählt ALLE Elemente mit der Klasse link aus und setzt die Hintergrundfarbe auf rot
    $(&#039;.link&#039;).css(&#039;background-color&#039;, &#039;red&#039;);

    //Wählt ALLE Input-Elemente aus und setzt deren Hintergrundfarbe auf rot
    $(&#039;input&#039;).css(&#039;background-color&#039;, &#039;red&#039;);
&lt;/script&gt;
</pre>
</pre>
<p>Das obere Beispiel zeigt wie wir mit mir einer Zeile eine ganze menge Elemente bearbeiten können, die ganze Arbeit erledigt jQuery für uns im Hintergrund. Hier habe ich jQuerys methode "css" benutzt, diese erlaubt es uns eine bestimmte CSS-Eigenschaft eines Elements zu setzten oder zu bearbeiten.</p>
<p>Das ist eigentlich schon das Grundkonzept von jQuery, man wählt sich die Elemente aus mit denen man etwas anstellen will und führt einige Modifikationen an ihnen durch.</p>
<p>Weiterhin bietet uns jQuery auch die Möglichkeit Events anzulegen und zu behandeln, was für uns in Hinsicht auf unsere Aufgaben gleich noch wichtig wird. Aber zunächst ein kleines Beispiel:</p>
<pre>
<pre class="brush: javascript; ">

$(&#039;.my_button&#039;).click(function () {
	$(&#039;.my_button&#039;).toggleClass(&#039;some_css_class&#039;);
});
</pre>
</pre>
<p>Dieser Dreizeiler hat es schon ganz schön in sich, denn hier geschieht eine ganze Menge. Als erstes suchen wir uns das Element mit der Klasse my_button und fügen diesem mit der Click-Methode ein Click-Event hinzu. Als Parameter übergeben wir hier auch gleich die Methode, die ausgeführt werden soll, wenn der Benutzer auf dieses Element klickt.</p>
<p>Innerhalb der Methode wählen wir dann dieses Element erneut aus und ändern dessen Klasse mit der toggleClass Methode. Diese Methode hat aber eine Sonderheit, nämlich dass sie sich merkt welche Klasse diesem Element zugewiesen war bevor darauf geklickt wurde, so wird bei einem erneuten Klick die Klasse wieder zurückgetauscht zu der ersten Klasse.</p>
<p>Das ändern der Klassen von Elementen ist sehr wichtig, denn so kann man sehr einfach das Aussehen von diesen ändern. Wenn der Benutzer seinen Namen eingegeben hat soll er Feedback bekommen ob dieser Name ok ist, das soll so realisiert werden:</p>
<div>
<dl>
<dt><img src="http://server.bigbasti.com/uploads/uploads/232118231781282.png " alt="" width="500" height="112" /></dt>
<dd>Ablauf der Visualisierung</dd>
</dl>
</div>
<p>Eingabe -&gt; Überprüfung (Auf dem Server) -&gt; Anzeige des Ergebnisses. Dank der kleinen Icons im Textfeld weiß der Benutzer sofort wie es um seinen Namen steht und er kann auch erkennen, dass die Webseite gerade beschäftigt ist durch den kleinen Kreisel in Schritt 2. Und falls es nicht klappt weiß der Benutzer sofort woran es gelegen hat, da er eine genaue Fehlermeldung bekommt. Und das alles geschieht ohne die Seite neuladen zu müssen nebenbei.</p>
<p>Das Nachladen der benötigten Informationen im Hintergrund nennt man <a href="http://de.wikipedia.org/wiki/Ajax_(Programmierung)" target="_blank">Ajax</a>, dabei ist das keine neue Technologie, sondern einfach nur eine Art einen Request im Hintergrund über JavaScript abzusetzen.</p>
<p>Da wir oben bereits unser Formular angefertigt haben, über das der Benutzer sich registrieren soll können wir uns nun etwas um die Serverseite kümmern und erstellen die nötigen Actions in dem Validation Controller der für die Überprüfung der Vom Benutzer eingegebenen Werte zuständig sein wird:</p>
<pre>
<pre class="brush: csharp; ">

public class ValidationController : Controller
{
    //
    // GET: /Validation/CheckUsername/[name]

    public String CheckUsername(string username)
    {
        //Wenn in unserer &quot;Datenbank&quot; der Name bei einem anderen Benutzer Auftaucht
        if (new UserDatabase().Users.Where(u =&gt; u.Username.Equals(username)).ToList().Count &gt; 0) {
            //Eine Fehlermeldung zurückgeben
            return &quot;Dieser Benutzername ist schon vergeben&quot;;
        }

        //Wenn der Benutzername kürzer als 5 Zeichen ist ebenfalls Fehler ausgeben
        if(username.Length &lt; 5){
            return &quot;Der Benutzername ist zu Kurz!&quot;;
        }

        //Falls es nichts zu meckern gibt geben wir &quot;ok&quot; aus
        return &quot;ok&quot;;
    }
}
</pre>
</pre>
<p>In diesem Controller habe ich eine Action Methode definiert, die einen string zurück gibt statt einem ActionResult, dadurch wird der Text den wir im Returnstatement abgeben direkt an den Browser weitergereicht ohne Umweg über eine View die wir uns dadurch sparen.<br />
Die Methode selbst macht nichts spannendes, zu erst wird hier die UserDatabase nach Usern durchsucht die den selben Namen haben und bei einem Treffer eine Fehlermeldung ausgegeben und als zweites führe ich eine Prüfung darauf durch ob der Benutzername zu kurz ist. - Falls alle Kriterien passen geben wir ein "ok" zurück.<br />
Die UserDatabase Klasse ist übrigens nur ein Dummy Repository, dass für uns eine Datenbank simuliert:</p>
<pre>
<pre class="brush: csharp; ">

public class UserDatabase {

    public List Users;

    public UserDatabase() {
        Users = new List(){
            new User(){Username = &quot;Bernd&quot;, Useremail = &quot;bernd@gmx.de&quot;},
            new User(){Username = &quot;Bill&quot;, Useremail = &quot;bill@microsoft.de&quot;}
        };
    }
}
public class User {
    public string Username { get; set; }
    public string Useremail { get; set; }
}
</pre>
</pre>
<p>Nun haben wir eine sehr simple Überprüfung des Benutzernamen eingebaut. Machen wir das gleich noch mal für die Email Adresse und das Passwort:</p>
<pre>
<pre class="brush: csharp; ">

public string CheckEmail(string email) {
    //Wenn in unserer &quot;Datenbank&quot; die Emailadresse bei einem anderen Benutzer Auftaucht
    if (new UserDatabase().Users.Where(u =&gt; u.Useremail.Equals(email)).ToList().Count &gt; 0) {
        //Eine Fehlermeldung zurückgeben
        return &quot;Diese Emialadresse ist schon vergeben&quot;;
    }

    return &quot;ok&quot;;
}

public string CheckPassword(string password) {
    //Unser einziges Kriterium für das Passwort ist dass es mindestens 4 Zeichen lang sein muss
    if (password.Length &lt; 4) {
        return &quot;Das Passwort ist zu kurz!&quot;;
    }

    return &quot;ok&quot;;
}
</pre>
</pre>
<p>Absolut nichts kompliziertes wie ihr seht. Natürlich halte ich hier die Methoden und Aktionen sehr simpel um dies verständlicher zu machen, in einem echten Projekt würde man hier natürlich anders vorgehen. Das werden wir dann im zweiten Teil besprechen.</p>
<p>Da unser Backend nun bereit ist müssen wir uns jQuery kümmern und unserem Formular beibringen im Hintergrund mit dem Server zu kommunizieren.</p>
<pre>
<pre class="brush: javascript; ">

$(document).ready(function () {

    $(&#039;#UserName&#039;).change(function () {
        //Diese Aktion wird ausgeführt wenn sich der Test im Username
        //Textfeld ändert

        //Style klassen entfernen und die validierungsklasse einfügen
        $(&#039;#UserName&#039;).removeClass(&#039;validation_ok validation_error&#039;);
        $(&#039;#UserName&#039;).addClass(&#039;validating&#039;);

        var username = $(&#039;#UserName&#039;).val();
        $.ajax({ url: &#039;/Validation/CheckUserName/&#039; + username,
            success: function (data) {
                if (data == &quot;ok&quot;) {
                    //Die Daten wurden vom Controller akzeptiert
                    $(&#039;#UserName&#039;).removeClass(&#039;validating&#039;);
                    $(&#039;#UserName&#039;).addClass(&#039;validation_ok&#039;);
                    $(&#039;#UserName_error&#039;).html(&#039;&#039;);
                } else {
                    //Fehlermeldung vom Server ausgeben
                    $(&#039;#UserName&#039;).removeClass(&#039;validating&#039;);
                    $(&#039;#UserName&#039;).addClass(&#039;validation_error&#039;);
                    $(&#039;#UserName_error&#039;).html(data);
                }
            }
        });
    });
});
</pre>
</pre>
<p>Gehen wir den Code mal gemeinsam durch, wir beginnen mit der jQuery Funktion "ready", diese wird automatisch ausgeführt sobald der Browser die komplette Seite geladen hat. Als Parameter übergeben wir eine anonyme Funktion, die daraufhin direkt ausgeführt wird.</p>
<p>Innerhalb dieser Funktion (Zeile 3) benutzen wir die jQuery Selektoren um die Textbox mit der id "UserName" zu schnappen und hängen dieser ein "change" Event an. Dieses Event wird immer ausgeführt wenn sich der Inhalt der Textbox ändert. An dieser Stelle wollen wir eingreifen und die geänderten Daten zum Server senden, damit er diese prüfen kann.</p>
<p>In Zeile 8 und 9 benutzen wir die "removeClass" und "addClass" Funktionen von jQuery um der "UserName" Textbox CSS Klassen hinzuzufügen oder wegzunehmen. So fügen wir in Zeile 9 die CSS Klasse hinzu, durch die die TextBox das Animations-GIF erhält, das dem Benutzer anzeigt, dass die Eingaben überprüft werden.</p>
<p>Der Spannende Teil beginnt erst in Zeile 11, denn hier lesen wir den Benutzernamen aus der Textbox und senden diesen dann über die<a href="http://api.jquery.com/jQuery.ajax/"> "ajax" Methode von jQuery</a> zum Server. Diese Methode von jQuery ist sehr mächtig und man kann hier dementsprechend diverse Parameter definieren, aber wir benutzen hier stattdessen nur die einfachste Variante, und diese benötigt nur die URL an die der Request gesendet werden soll und eine Referenz auf eine Funktion die ausgeführt werden soll wenn alles erfolgreich verlaufen ist.</p>
<p>Die URL selbst haben wir durch die Namen unserer Controller im Backend schon vergeben, denn wir sprechen hier den Validation-Controller an und rufen die CheckUserName-Methode auf, der wir den eingelesenen Namen als Parameter übergeben. Heraus kommt eine URL wie z.B. diese hier: localhost/Validation/CheckUserName/Bill.</p>
<p>Nachdem der Request nun angesendet wurde und erfolgreich eine Antwort empfangen wurde, wird unsere anonyme Funktion ausgeführt, die das vom Server zurückgegebene Ergebnis auswertet. Im Fall dass der Server ein "ok" zurückgibt wird ein grüner Haken im Textfeld angezeigt und ansonsten ein rotes "x" und die Fehlermeldung in nebenstehenden span ausgegeben. (Zeile 23)</p>
<p>Schauen wir uns doch mal an ob alles so funktioniert wie geplant:</p>
<div>
<dl>
<dt><img title="Es funktioniert!" src="http://server.bigbasti.com/uploads/uploads/8521121543632945.png " alt="" width="584" height="229" /></dt>
<dd>Notiz des Autors: Bei dieser Abbildung wurde kein Wert auf optische Schönheit gelegt</dd>
</dl>
</div>
<p>Wie man sieht wurde der Benutzername "Bernd" als fehlerhaft markiert, da dieser bereits in unserer "Datenbank" auftaucht, die Emailadresse hingegen ist ok, da sie noch nicht benutzt wird.</p>
<p>Die jQuery Implementierung für die restlichen  Textfelder kann eigentlich 1 zu 1 übernommen werden, es sollten lediglich die Parameter ausgetauscht werden. Die einzige kleine Besonderheit stellt die Prüfung des Passworts dar, ob die beiden Felder gleich sind, das kann man nämlich komplett clientseitig regeln, ohne die Daten zum Server zu senden:</p>
<pre>
<pre class="brush: csharp; ">

$(&#039;#UserPass2&#039;).change(function () {
    //Diese Aktion wird ausgeführt wenn sich der Text im Passwort
    //Textfeld ändert

    //Style klassen entfernen
    $(&#039;#UserPass2&#039;).removeClass(&#039;validation_ok validation_error&#039;);

    var pass = $(&#039;#UserPass&#039;).val();
    var pass2 = $(&#039;#UserPass2&#039;).val();

    if (pass == pass2) {
        //Die Daten wurden vom Controller akzeptiert
        $(&#039;#UserPass2&#039;).addClass(&#039;validation_ok&#039;);
        $(&#039;#UserPass2_error&#039;).html(&#039;&#039;);
    } else {
        //Fehlermeldung ausgeben
        $(&#039;#UserPass2&#039;).addClass(&#039;validation_error&#039;);
        $(&#039;#UserPass2_error&#039;).html(&#039;Die Passwörter sind nicht gleich&#039;);
    }
});
</pre>
</pre>
<p>Im Grunde sind wir nun fertig und haben auf einfachste Weise unser Registrierungsformular aufgewertet und dem User vielleicht ein paar Nerven gespart.</p>
<p>Ich möchte hier noch mal hinweisen, dass man in einem Realprojekt nicht so handeln würde, da es viel zu umständlich und nicht wirklich gut wartbar ist. Dieser Beitrag soll lediglich die Grundlagen erklären und zeigen wie man so etwas zu Fuß und mit den grundlegendsten Mitteln erstellen kann.</p>
<p>Im nächsten Teil werden wir dann die MVC3 eigenen Features benutzen die uns diese Aufgaben um einiges erleichtern und zu einem Großteil automatisch funktionieren.</p>
<p>Das Demo-Projekt könnt ihr hier laden: <a href="http://blog.bigbasti.com/MVCjQueryDemo1" target="_blank">Download [VS2010 c#]</a></p>
<p><a href="http://blog.bigbasti.com/benutzerregistrierung-mit-asp-net-mvc-und-jquery-teil-2/">Teil 2 lesen &gt;&gt;</a><br />
<a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.bigbasti.com%2fbenutzerregistrierung-mit-asp-net-mvc-und-jquery-teil-1%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.bigbasti.com%2fbenutzerregistrierung-mit-asp-net-mvc-und-jquery-teil-1%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1676&amp;md5=576cb7c310e4397f56b8f1f156db28a5" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/benutzerregistrierung-mit-asp-net-mvc-und-jquery-teil-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Unterlagen zu meinem &#8216;ASP.NET MVC 3 von 0 an&#8217; Vortrag</title>
		<link>http://blog.bigbasti.com/unterlagen-zu-meinem-asp-net-mvc-3-von-0-an-vortrag/</link>
		<comments>http://blog.bigbasti.com/unterlagen-zu-meinem-asp-net-mvc-3-von-0-an-vortrag/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 19:19:29 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1631</guid>
		<description><![CDATA[Gestern am 04.04.2011 habe ich für die .NET Online Usergroup einen Vortrag für ASP.NET MVC 3 Einsteiger gegeben, vielleicht wart ihr sogar dabei.

Da schnell die Frage nach den Folien und dem Beispielcode der während der Präsentation entstand aufkam, möchte ich diese hiermit nachliefern.
Installation
In meinem Vortrag ging ich nicht darauf ein, wie man ASP.NET MVC ...]]></description>
			<content:encoded><![CDATA[<p>Gestern am 04.04.2011 habe ich für die .NET Online Usergroup einen Vortrag für ASP.NET MVC 3 Einsteiger gegeben, vielleicht wart ihr sogar dabei.</p>
<p>Da schnell die Frage nach den Folien und dem Beispielcode der während der Präsentation entstand aufkam, möchte ich diese hiermit nachliefern.</p>
<h3>Installation</h3>
<p>In meinem Vortrag ging ich nicht darauf ein, wie man ASP.NET MVC installiert, dies will ich hiermit nachliefern. Die Installation erfolgt schnell und einfach über den ASP.NET MVC Installer den ihr auf der <a href="http://www.asp.net/mvc/mvc3" target="_blank">ASP.NET MVC Homepage</a> bekommt oder über diesen <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=d2928bc1-f48c-4e95-a064-2a455a22c8f6&amp;displaylang=en" target="_blank">Direktlink</a>. Die Installation an sich ist nicht weiter erwähnenswert <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Nach der Installation werden ihr die Projektvorlage in Visual Studio vorfinden.</p>
<h3>Kostenlos ASP.NET MVC Entwickeln</h3>
<p>Falls ihr keine Visual Studio Lizenz besitzt könnt ihr den Visual Web Developer benutzen um MVC zu entwickeln:<br />
<a href="http://www.microsoft.com/germany/express/products/web.aspx">http://www.microsoft.com/germany/express/products/web.aspx</a></p>
<h3>Aufzeichnung</h3>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=22117382&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" /><embed type="application/x-shockwave-flash" width="400" height="225" src="http://vimeo.com/moogaloop.swf?clip_id=22117382&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1&amp;autoplay=0&amp;loop=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/22117382">ASP.NET MVC von 0 an</a> from <a href="http://vimeo.com/noug">.NET Online User Group</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<h3>Präsentation</h3>
<p><a href="http://server.bigbasti.com/uploads/uploads/asp.net_mvc_von_0_an.pptx "><img class=" alignnone" title="Die Präsentation im Powerpoint 2010 (PPTX) Format" src="http://server.bigbasti.com/uploads/uploads/66211231723871999.png" alt="" /></a> <a href="http://server.bigbasti.com/uploads/uploads/asp.net_mvc_von_0_an.pdf "><img class="alignnone" title="Die Präsentation als PDF (Ohne Aanimationen)" src="http://server.bigbasti.com/uploads/uploads/662112317363681999.png" alt="" /></a></p>
<h3>Code (mit Kommentaren)</h3>
<p><a href="http://server.bigbasti.com/uploads/uploads/MyMVCGuestbook.zip "><img class="alignnone" title="Download das Projekt aus dem Vortrag" src="http://server.bigbasti.com/uploads/uploads/662112317592981999.png" alt="" /></a></p>
<h3>Feedback &amp; Fragen</h3>
<p>Falls du bei dem Vortrag dabei warst und noch Fragen hast oder einen (Verbesserungs)vorschlag oder Feedback hast kannst du das auch gerne als Kommentar posten.</p>
<p>Bis zum nächsten Mal!</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1631&amp;md5=de19ebed67eb6357342a957ce2b030a9" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/unterlagen-zu-meinem-asp-net-mvc-3-von-0-an-vortrag/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Jede Adventswoche ein Microsoft Press E-Book gratis</title>
		<link>http://blog.bigbasti.com/jede-adventswoche-ein-microsoft-press-e-book-gratis/</link>
		<comments>http://blog.bigbasti.com/jede-adventswoche-ein-microsoft-press-e-book-gratis/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 08:29:28 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1439</guid>
		<description><![CDATA[Wie auch letztes Jahr verschenkt Microsoft Press auch dieses Jahr wieder E-Books. Dabei gibt es jede Adventswoche ein neues E-Book, dass kostenlos heruntergeladen werden kann.

Den Anfang macht heute das Windows 7 Home Premium "Maxibuch", das ca 1000 Seiten umfasst.


Microsoft Windows 7 wird mit "Microsoft Windows 7 Home Premium - Das MAXIBUCH" erst richtig schön. ...]]></description>
			<content:encoded><![CDATA[<p>Wie auch letztes Jahr verschenkt Microsoft Press auch dieses Jahr wieder E-Books. Dabei gibt es jede Adventswoche ein neues E-Book, dass kostenlos heruntergeladen werden kann.</p>
<p>Den Anfang macht heute das Windows 7 Home Premium "Maxibuch", das ca 1000 Seiten umfasst.</p>
<p><a href="http://blog.bigbasti.com/uploads/buch01.jpg"><img class="alignleft size-full wp-image-1440" title="buch01" src="http://blog.bigbasti.com/uploads/buch01.jpg" alt="" width="220" height="240" /></a></p>
<blockquote><p>Microsoft Windows 7 wird mit "Microsoft Windows 7 Home Premium - Das MAXIBUCH" erst richtig schön. Damit Sie die vielen Möglichkeiten entdecken und verstehen, hat sich das Autorenteam lange mit Windows 7 Home Premium auseinandergesetzt.<br />
Sie erhalten von uns kostenlos eine gelungene und sehr ausführliche Windows 7-Beschreibung!<br />
Wissen aus erster Hand auf über 1.000 Seiten! (PDF, 80.2 MB)<br />
Rechnen Sie unbedingt auch mit Tipps, wie Sie schneller, einfacher und sicherer arbeiten - und Spaß bekommen.</p></blockquote>
<p>Wer Interesse hat muss lediglich seine E-Mail Adresse auf der <a href="http://advent.microsoft-press.de/" target="_blank">Aktionsseite </a>eintragen und bekommt einen Download-link zugeschickt.</p>
<p>Nachtrag:</p>
<p>Anscheinend sind momentan die Server ziemlich ausgelastet:</p>
<blockquote><p>Entschuldigung.<br />
Unser Downloadserver ist überlastet.<br />
Bitte Versuchen Sie es in wenigen Minuten noch einmal.<br />
Vielen Dank für Ihre Verständnis.</p></blockquote>
<p>Aber zum Glück hat man die Ganze Woche Zeit um es herunterzuladen. <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.bigbasti.com%2fjede-adventswoche-ein-microsoft-press-e-book-gratis%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.bigbasti.com%2fjede-adventswoche-ein-microsoft-press-e-book-gratis%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1439&amp;md5=0a07883a27eb7c12356392c566aabaeb" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/jede-adventswoche-ein-microsoft-press-e-book-gratis/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC3: Was gibts neues?</title>
		<link>http://blog.bigbasti.com/asp-net-mvc3-was-gibts-neues/</link>
		<comments>http://blog.bigbasti.com/asp-net-mvc3-was-gibts-neues/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 19:53:00 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/asp-net-mvc3-was-gibts-neues/</guid>
		<description><![CDATA[Einige von euch haben es sicher mitbekommen, dass vor Kurzem der Release Candidate (RC) von ASP.NET MVC3 veröffentlich wurde. Download, Changelog. Diese neue Version bringt einige für uns Entwickler tolle neue Funktionen und Vereinfachungen mit.

Die wohl auffälligste Neuerung ist die neue ViewEngine namens Razor, diese sorgt dafür, dass die Views um einiges schlanker und ...]]></description>
			<content:encoded><![CDATA[<p>Einige von euch haben es sicher mitbekommen, dass vor Kurzem der Release Candidate (RC) von ASP.NET MVC3 veröffentlich wurde. <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a920ccee-1397-4feb-824a-2dfefee47d54&amp;displaylang=en">Download</a>, <a href="http://www.asp.net/learn/whitepapers/mvc3-release-notes">Changelog</a>. Diese neue Version bringt einige für uns Entwickler tolle neue Funktionen und Vereinfachungen mit.</p>
<p>Die wohl auffälligste Neuerung ist die neue ViewEngine namens Razor, diese sorgt dafür, dass die Views um einiges schlanker und lesbarer werden durch die Einführung einer neuen Syntax.</p>
<p>Ich will mit euch ein kleines Beispielprojekt erstellen in dem wir Schritt für Schritt einige der Neuerungen durchgehen.</p>
<p>Fangen wir an und erstellen ein neues MVC3 Projekt in Visual Studio und bereits hier gibts es was Neues zu betrachten:</p>
<p><img src="http://blog.bigbasti.com/uploads/new-proj.png" alt="" /></p>
<p><em>Bild 1: Der Neue Projekt erstellen Dialog</em></p>
<p>Da wir von Vorn beginnen möchten erstellen wir ein neues Leeres Projekt und wählen die neue Razor ViewEngine.</p>
<p><strong>Layout</strong></p>
<p>Wenn man nun einen Blick auf den Projektmappenexplorer wirft, wird man drin nicht viel finden, lediglich eine CSS- und zwei cshtml-Dateien. Die cshtml-Dateien fangen auch noch mit einem Unterstrich (_) an und haben irgendwas mit Layout im Namen.</p>
<p>Was ist das?</p>
<p>Öffnen wir zunächst im Shared-Ordner die Datei _Layout.cshtml.</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb.png" border="0" alt="image" width="608" height="282" /></a></p>
<p>Diese Datei kann man mit einer MasterPage aus MVC2 vergleichen. Wenn ihr genau hinschaut werdet ihr im Title-Tag einen Platzhalter finden und auch im body-div ist einer namens „@RenderBody()“.</p>
<p>Die Layoutseiten in MVC3 funktionieren anders als die in MVC2, auch wenn diese Seite auch Platzhalter besitzt die später mit Inhalt befüllt werden fällt dennoch die Methode RenderBody() auf. Diese Methode ist in jeder Layout-Seite drin und steht immer an der Stelle wo später der Inhalt der Seite  stehen wird. Neben der RenderBody()-Methode gibt es auch die RenderSection()-methode, die auch einen Namen bekommen und auch als optional markiert werden können.</p>
<p>Was auch neu ist, ist dass wir keine &lt;% %&gt; Tags mehr haben in die wir den ASP.NET Code schrieben können, das alles übernimmt nun das @-Zeichen. Das System ist dabei so intelligent, dass es erkennt bis wohin der Code geht weswegen man auch kein schließen Tag benötigt. <a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx">Weitere Informationen zu der Razor Syntax</a>.</p>
<p>Wie man sieht sind die ganzen JavaScript Verweise auskommentiert. Bitte entfernt die Kommentarmarkierung, da wir diese Skripte bald benötigen.</p>
<p>Gut, schleißen wir diese Datei und werfen nun einen Blick in die „_ViewStat.cshtml“ in unserem Views-Ordner:</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image1.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb1.png" border="0" alt="image" width="383" height="54" /></a></p>
<p>Der Inhalt hier ist wie man sieht sehr übersichtlich <img class="wlEmoticon wlEmoticon-smile" style="border-style: none;" src="http://blog.bigbasti.com/uploads/wlEmoticon-smile.png" alt="Smiley" /></p>
<p>Was macht diese Datei nun? Wie man sieht verweist diese auf die _Layout.cshtml die wir eben betrachtet haben, dabei sorgt dieser Verweis dafür, dass alle Views in dem Views-Ordner inkl Unterordner diesen Verweis auch erhalten. Das hat zur Folge, dass man nun nicht mehr in jeder einzelnen View diese Referenz auf die Layoutdatei eintragen muss und spart sich so den redundanten Code.</p>
<p>Viel mehr gibt es dazu eigentlich auch nicht zu sagen. Gehen wir nun zum nächsten Schritt und erstellen eine neue View.</p>
<p><strong>Views</strong></p>
<p>Wenn ihr den View-Hinzufügen Dialog wählt werdet ihr auch hier eine Veränderung feststellen:</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image2.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb2.png" border="0" alt="image" width="384" height="388" /></a></p>
<p>Wie man sieht kann man nun auch bei jeder einzelnen View wählen, welche ViewEngine man hier gern verwenden möchte. Legen wir eine gewöhnliche View an.</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image3.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb3.png" border="0" alt="image" width="412" height="112" /></a></p>
<p>Die neue View enthält nun nur diese paar Zeilen Code (siehe Bild oben).</p>
<p>Zuerst wird ein Codeblock aufgemacht mit der @{ … } Syntax, das bedeutet, dass nun nur noch ASP.NET Code kommt bis die schließen Klammer kommt, auch über mehrere Zeilen.</p>
<p>Innerhalb dieses Codeblocks füllen wir nun den Titel unserer Seite, wenn ihr euch erinnern könnt wurde diese Variable in der MasterPage im Title-Tag wieder ausgegeben.</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image4.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb4.png" border="0" alt="image" width="353" height="115" align="left" /></a></p>
<p>Man beachte hier, dass diese Property dynamisch erstellt wird und es die Property „Title“ eigentlich gar nicht gibt. Diese wird dann zur Laufzeit generiert und mit Inhalt befüllt. So kann man beliebig viele solcher Properties anlegen.</p>
<p>In Zeile 3 geben wir an welche MasterPage hier verwendet werden soll, da wir aber bereits die Datei „_ViewStat.cshtml“ in unserem Views-Ordner liegen haben müssen wir innerhalb der View keinen Verweis mehr auf eine Masterpage setzen. (Außer wir wollen eine andere Nutzen) Also können wir diese Zeile aus unserem Code löschen.</p>
<p>Nun fängt schon ab Zeile 6 der normale HTML Quelltext an, ohne dass wir irgendwo einen Zugehörigkeitsbereich definiert haben. Das ist ein weiteres MVC3 / Razor Feature, denn alles wird an der stelle in der MasterPage eingesetzt wo wir die Methode RenderBody() aufrufen. Eine Ausnahme besteht, wenn wir Sektionen in der Masterpage definiert haben, diese würden dann dementsprechend der passenden Sektion zugeordnet werden.</p>
<p>So könnte eine Sektion aussehen:</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image5.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb5.png" border="0" alt="image" width="327" height="107" /></a></p>
<p>Das wars nun soweit zu dieser View. Wenn ihr mögt könnt ihr nun weiter damit arbeiten wie mit einer gewöhnlichen View.</p>
<p>Nun wollen wir mal ein Formular anlegen, dass wir zum Registrieren eines Benutzers nutzen wollen. Dazu benötigen wir zunächst ein Model auf das wir dann unsere View mit der Form  typisieren.</p>
<p>Legen wir also eine neue Klasse im Models-Verzeichnis an. Die Model Klassen verhalten sich in MVC3 eigentlich genauso wie in MVC2, nun sind aber einige neue Attribute hinzugekommen die ich euch hier mal vorstellen möchte:</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image6.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb6.png" border="0" alt="image" width="444" height="406" /></a></p>
<p>Wie ihr seht hat meine Modelklasse 5 Eigenschaften. Die ersten drei sind mit dem Attribut [Required] markiert und sind somit Pflichtfelder. Alle Eigenschaften besitzen ein [DisplayName()] Attribut, dass den Text enthält, der später in der View angezeigt werden soll.</p>
<p>Kommen wir nun zu den neuen Attributen. Erstmal das [Required, Compare(…)] Attribut. Dieses Attribut sorgt hier dafür, dass „RepeatEmail“ mit „Email“ verglichen wird und übereinstimmen muss damit die Validierung erfolgreich ist. So müssen wir diese zwei Werte nun nicht mehr im Controller manuell vergleichen.</p>
<p>Weiter unten bei der About-Eigenschaft finden wir ein weiteres neues Attribut namens [SkipRequestValidation] – Im Prinzip sagt der Name schon alles aus. Dieses Attribut sorgt dafür, dass diese Property beim Binding keine Exception wirft wenn dort HTML enthalten ist.</p>
<p>Früher musste man dann im Controller die Action mit einem [ValidateInput(false)] markieren, was natürlich immer noch funktioniert, aber nun kann man auch einzelne Properties bequem markieren ohne gleich für die ganze Methode den Validationinput abzuschalten.</p>
<p>Hier gibts es nun sogar die Möglichkeit bestimmte Properties von der Validierung auszuschließen:</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image7.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb7.png" border="0" alt="image" width="371" height="66" /></a></p>
<p>Hier werden die Properties “Body” und “Summary” nicht auf HTML Inhalt überprüft.</p>
<p>Wie ihr sehen könnt habe ich ein Attribut auskommentiert. Auf dieses Attribut habe ich mich persönlich sehr gefreut, aber es scheint nicht zu funktionieren (oder ich mache etwas falsch, wenn ihr meinen Fehler seht bitte kommentieren ACHTUNG: dazu habe ich<a href="http://blog.bigbasti.com/asp-net-mvc3-remote-attribut-richtig-nutzen/" target="_blank"> hier ein Update</a> geschrieben)</p>
<p>Dieses RemoteAttribut erlaubt es eine Eigenschaft an eine Methode in einem Controller zu binden und währen der Ausführung der View beim Client im Hintergrund über Ajax aufzurufen. Für den Fall von der Property Name würde die Methode UserNameAvailabla im Controller Register aufgerufen werden, welche ein boolean zurück gibt. So wird dann dynamisch eine Fehlermeldung auf der View erscheinen.</p>
<p>Wenn man dieses RemoteAttribut nun benutzen möchte muss man natürlich die oben angegebene Methode im angegebenen Controller implementieren, zB so:</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image8.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px initial initial;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb8.png" border="0" alt="image" width="724" height="185" /></a></p>
<p>Diese Methode wird dann beim Validieren per Ajax aufgerufen und zeigt dann dementsprechend auch eine Fehlermeldung an (Falls nötig):</p>
<p><a class="thickbox" href="http://blog.bigbasti.com/uploads/image9.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.bigbasti.com/uploads/image_thumb9.png" border="0" alt="image" width="489" height="50" /></a></p>
<p>Zum Schluss möchte ich noch darauf hinweisen, dass ich ein bestimmtes kleines Feature vermisst habe, nämlich eine bequeme Möglichkeit einen String auszugeben ohne diesen mit HTML zu Encoden. Denn soweit bietet Razor leider keine Möglichkeit dafür. Deswegen muss man hier mit einer eigenen kleinen Extension Methode aushelfen.</p>
<p>Das wäre es dann nun auch für heute. Ich habe ein kleines Beispiel Projekt vorbereitet, dass ihr <a href="http://blog.bigbasti.com/uploads/NewAttributes.zip" target="_blank">hier herunterladen</a> könnt. (.NET 4.0 VS2010)</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1396&amp;md5=401b772f11d0ab6d2e5710989c59b794" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/asp-net-mvc3-was-gibts-neues/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 2: Custom ErrorPages anlegen</title>
		<link>http://blog.bigbasti.com/asp-net-mvc-2-custom-errorpages-anlegen/</link>
		<comments>http://blog.bigbasti.com/asp-net-mvc-2-custom-errorpages-anlegen/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 13:17:21 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1323</guid>
		<description><![CDATA[Wenn man Webseiten entwickelt möchte man diese natürlich möglichst anschaulich für den Nutzer gestalten, und dazu gehört es auch für den Benutzer anschauliche und auch verständliche Seiten zu präsentieren, auch wenn mal ein Fehler auftaucht. Im Normalfall passen die Default-Fehlerseiten von ASP.NET leider nicht ins Bild der restlichen Seite, weswegen wir gezwungen sind unsere ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/error404_alt.png"><img class="alignleft size-medium wp-image-1324" title="error404_alt" src="http://blog.bigbasti.com/uploads/error404_alt-300x230.png" alt="" width="126" height="97" /></a>Wenn man Webseiten entwickelt möchte man diese natürlich möglichst anschaulich für den Nutzer gestalten, und dazu gehört es auch für den Benutzer anschauliche und auch verständliche Seiten zu präsentieren, auch wenn mal ein Fehler auftaucht. Im Normalfall passen die Default-Fehlerseiten von ASP.NET leider nicht ins Bild der restlichen Seite, weswegen wir gezwungen sind unsere eigenen Fehlerseiten anzulegen.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/404errorpagedefault.png"><img class="aligncenter size-full wp-image-1327" title="404errorpagedefault" src="http://blog.bigbasti.com/uploads/404errorpagedefault.png" alt="" width="452" height="240" /></a><em>Bild 1: Typische 404 Fehlermeldung von ASP.NET</em></p>
<p>Eigene Fehlerseiten sind unter ASP.NET MVC 2 schnell in vier Schritten eingerichtet.</p>
<p><strong>1. Änderungen an der Web.config vornehmen</strong></p>
<p>Zunächst müssen in der Web.config die <a href="http://msdn.microsoft.com/de-de/library/h0hfz6fc%28VS.80%29.aspx" target="_blank">customErrors</a> eingeschaltet werden. Hier können die Attribute "defaultRedirect", welches die Adresse definiert die im Falle eines Fehlers aufgerufen wird und "mode", dass einstellt ob Fehler angezeigt werden sollen oder nicht.</p>
<p><a href="http://blog.bigbasti.com/uploads/xmlcode.png"><img class="aligncenter size-full wp-image-1330" title="xmlcode" src="http://blog.bigbasti.com/uploads/xmlcode.png" alt="" width="499" height="95" /></a>Mit den inneren "error"-Ästen kann man dazu noch spezifische Seiten zu einzelnen Fehlercodes zuweisen. Man kann hier sowohl eine  absolute Adresse angeben oder nur eine relative. Für alle nicht spezifizierten Errorcodes wird die Url aus dem customError Tag benutzt.</p>
<p>Wenn ihr diese Einstellungen Lokal testen wollt dann solltet ihr auch den "mode" auf "On" stellen, da ihr euere Seiten sonst nicht zu Gesicht bekommt.</p>
<p><strong>2. Anlegen des Controllers für die Fehlerbehandlung</strong></p>
<p>Wie ihr sehen könnt habe ich hier eine lokale Adresse angegeben. Hierbei wird der Controller "Error" aufgerufen und je nach Fehlercode eine andere Methode.</p>
<p>Im Controller haben wir hier eigentlich nichts besonderes:</p>
<p><a href="http://blog.bigbasti.com/uploads/contollercode.png"><img class="aligncenter size-full wp-image-1332" title="contollercode" src="http://blog.bigbasti.com/uploads/contollercode.png" alt="" width="569" height="426" /></a>Ich war an dieser Stelle mal faul und habe nur eine einzige View für alle Fehler angelegt, die dann die übergebene message ausgibt. Dazu kommt noch, dass wir der Response noch den passenden HttpStatusCode übergeben, da manche Anwendungen danach gehen und so prüfen, ob ein Aufruf erfolgreich war.</p>
<p><strong>3. Die View</strong></p>
<p>Wie eben erwähnt macht die View in meinem Beispiel nichts anderes als den Inhalt der Messagevariable auszugeben. Hier könnt ihr natürlich eurer Kreativität freien Lauf lassen und auch für jeden Error eine einzelne View anfertigen.</p>
<p><a href="http://blog.bigbasti.com/uploads/viewcontent.png"><img class="aligncenter size-full wp-image-1334" title="viewcontent" src="http://blog.bigbasti.com/uploads/viewcontent.png" alt="" width="547" height="83" /></a><strong>4. Glogal.asax - Catch All Route registrieren</strong></p>
<p>Zum Schluss sollten wir noch eine sogenannte Catchall Route einrichten, <span style="text-decoration: underline;">die wir nach allen unseren Routen positionieren</span> damit diese nur greifen kann, wenn keine der anderen gepasst hat, diese Route wird in jedem Fall aufgerufen, wenn keine der vorderen gepasst hat.</p>
<p><a href="http://blog.bigbasti.com/uploads/globalasax.png"><img class="aligncenter size-full wp-image-1335" title="globalasax" src="http://blog.bigbasti.com/uploads/globalasax.png" alt="" width="585" height="289" /></a>Wenn die CatchAll Route greift wird der Home Controller aufgerufen und die Action "NotFound" ausgeführt.</p>
<p>Im Grunde sind wir nun fertig, alle von uns eingetragenen Fehler werden nun abgefangen und durch von uns präparierten Seiten ersetzt. Das einzige was noch passieren kann ist dass ihr im IIS andere ErrorPages eingestellt habt, dann dann werden diese angezeigt und nicht die von euch erstellten. Hier müsst ihr die "Error Responses" auf "<em>Detailed errors" </em>stellen.</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1323&amp;md5=4a30b1ed784ba5fe53a221a2695a0b3f" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/asp-net-mvc-2-custom-errorpages-anlegen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java und C# &#8211; Die feinen Unterschiede</title>
		<link>http://blog.bigbasti.com/java-und-c-die-feinen-unterschiede/</link>
		<comments>http://blog.bigbasti.com/java-und-c-die-feinen-unterschiede/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 07:57:01 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1262</guid>
		<description><![CDATA[Immer wieder begegnen mir Leute, die Java und C# in die selbe Schupp-lade stecken. Man hört dann meist Sätze wie "C# ist Java von Microsoft", "Dann lerne ich doch gleich lieber Java statt Microsofts Kopie". Jeder der sich mit der .NET Plattform beschäftigt wird natürlich wissen, wie falsch diese Aussagen sind, die meist nur auf alten ...]]></description>
			<content:encoded><![CDATA[<p>Immer wieder begegnen mir Leute, die Java und C# in die selbe Schupp-lade stecken. Man hört dann meist Sätze wie "C# ist Java von Microsoft", "Dann lerne ich doch gleich lieber Java statt Microsofts Kopie". Jeder der sich mit der .NET Plattform beschäftigt wird natürlich wissen, wie falsch diese Aussagen sind, die meist nur auf alten Vorurteilen und Unwissenheit basieren.</p>
<p><strong>Die Anfänge</strong></p>
<p>Natürlich haben diese Vorurteile irgendwo etwas wahres dran, so ist es nicht von der Hand zu weisen, dass sich die <a href="http://www.javacamp.org/javavscsharp/" target="_blank">Syntax der beiden Sprachen</a> sehr sehr ähnlich ist, und auch die Ausführung des Codes in einer VM kann man auch zu den Gemeinsamkeiten zählen. So ist C# ja auch entstanden, als eine Mischung aus Java und C++. Dies sollte es den Leuten erleichtern auf die neue Plattform zu wechseln und schnell einen Einstieg zu finden, desweiteren hat es sich in der Technischen Welt bewährt gute und erfolgreiche Konzepte zu kopieren und zu <strong>perfektionieren/verbessern</strong>. So würde ich auch C# mehr als eine <em>Weiterentwicklung </em>von Java betrachten.</p>
<p><strong>Wo liegen die Unterschiede?</strong></p>
<p>Natürlich fragt man sich dann, wo die Unterschiede sind und wenn man sich etwas damit befasst, wird man feststellen, dass es doch ziemlich viele Unterschiede und (meiner Meinung nach sehr nützliche) Weiterentwicklungen gibt.</p>
<p>Hier ein paar Beispiele:</p>
<ul>
<li><a href="http://msdn.microsoft.com/de-de/library/w86s7x04(v=VS.80).aspx" target="_blank">Properties</a> - Saubere Model-Klassen ohne einen riesen GetBla &amp; SetBla Gestrüppe</li>
<li><a href="http://msdn.microsoft.com/de-de/library/ms173171(v=VS.80).aspx" target="_blank">Delegates</a> (Funktionszeiger) - Übergabe von <em>Funktionen als Parameter uvm.</em></li>
<li><a href="http://msdn.microsoft.com/de-de/library/bb397906.aspx" target="_blank">LINQ</a> (Language Integrated Queries)  - Objektorientierte SQL/XML-Abfragen</li>
<li><a href="http://msdn.microsoft.com/de-de/library/aa645739(v=VS.71).aspx" target="_blank">Events</a> - Erleichtert strickte Trennung von Schichten und Informationsweitergabe</li>
<li><a href="http://msdn.microsoft.com/de-de/library/bb397687.aspx" target="_blank">Lambda Ausdrücke</a> - Viel Arbeit auf wenig Platz (Wird eventuell im <a href="http://openjdk.java.net/projects/lambda/" target="_blank">JDK 1.7 Einzug halten</a>)</li>
<li><a href="http://www.fh-wedel.de/~si/seminare/ws02/Ausarbeitung/4.csharp/csharp4.htm#enums" target="_blank">Enums</a> und Colections</li>
</ul>
<p>Desweiteren gibt es auch wichtige Unterschiede, die <em>unter der Haube</em> ablaufen:</p>
<ul>
<li><a href="http://www.c-sharpcorner.com/UploadFile/yougerthen/101152008124829PM/1.aspx" target="_blank">Assembly-Konzept</a> - Einfache und schnelle Interaktion zwischen den .NET Sprachen wie C#, Visual C++.Net, Visual Basic.Net oder Delphi.Net</li>
<li><a href="http://www.javacamp.org/javavscsharp/namespace.html" target="_blank">Namespaces</a> - Auf den ersten Blick sehr ähnlich zu Packages , aber nicht auf den zweiten <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
</ul>
<p>Natürlich gibt es noch vieles mehr was an Unterschieden zu entdecken gibt. Wer da interessiert ist kann dich mal <a href="http://www.javacamp.org/javavscsharp/" target="_blank">diese Seite</a> anschauen mit vielen Beispielen und Vergleichen.</p>
<p><strong>Einsatzbereiche</strong></p>
<p>Sogar in den Einsatzgebieten ähneln sich die Plattformen sehr, denn wie mit Java kann man auch in .NET sowohl für Desktop, für Web und für mobile Plattformen entwickeln, wobei die mobilen Plattformen noch auf Windows Mobile beschränkt ist. (Aber <a href="http://www.heise.de/newsticker/meldung/Mono-fuer-Android-957517.html" target="_blank">Mono für Android</a> ist ist ja auch schon unterwegs)</p>
<p>Dank Mono kann man viele .NET Programme auch sehr einfach auf Unix Systeme portieren, womit man teilweise auch die Plattformunabhängigkeit von Java erreicht. (Mono unterstützt zur Zeit das komplette .NET Framework 2.0)</p>
<p><strong>Die Zukunft</strong></p>
<p>Microsoft entwickelt die .NET Plattform sehr aktiv. Vor Kurzem ist die 4te Version des Frameworks inklusive einer neuen Visual Studio Version erschienen. Weitere Releases und Weiterentwicklungen dürften somit auch bald folgen.</p>
<p style="text-align: left;">Bei Java schaut man momentan noch in eine ungewisse Zukunft, da Sun vor einer Weile von Oracle aufgekauft wurde, weis man nun nicht mit Sicherheit was aus den Produkten wird. So musste die Community bereits den <a href="http://www.pro-linux.de/news/1/16036/oracle-stellt-opensolaris-ein.html" target="_blank">Verlust von Open Solaris</a> hinnehmen und es hagelte auch schon die ersten <a href="http://www.tomshardware.de/Oracle-Google-Android-Java-Klage,news-244507.html" target="_blank">Patentklagen</a> wegen dem Aufbau der Java VM auf verschiedenen Plattformen. - Keine Rosigen Aussichten für Java Fans.</p>
<p style="text-align: left;">So scheinen nun sich die Feindbilder zu ändern. Lange Zeit war Microsoft wohl der Anführer der Bösewicht Nummer 1 - Liste, doch das Unternehmen hat sich gewandelt und stellt inzwischen sogar zu vielen Projekten sogar den Code zur Verfügung, so ist zum Beispiel ein großer Teil des .NET Frameworks einsehbar und auch das <a href="http://aspnet.codeplex.com/" target="_blank">ASP.NET MVC</a> Framework lässt sich komplett einsehen.</p>
<p style="text-align: left;">Die .NET Plattform ist inzwischen eine sehr mächtige geworden, und alle die es runterspielen oder ignorieren kann ich einfach nicht ernst nehmen. Und auch wenn man ein Open-Source-Junkie oder einfach nur ein Microsoft-Feind ist sollte man dennoch wissen, wovon man redet.</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1262&amp;md5=fea12218455bb05e27be0e5bef0e8756" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/java-und-c-die-feinen-unterschiede/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Add-On Perle: Visual Studio Productivity Power Tools</title>
		<link>http://blog.bigbasti.com/add-on-perle-visual-studio-productivity-power-tools/</link>
		<comments>http://blog.bigbasti.com/add-on-perle-visual-studio-productivity-power-tools/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 07:14:14 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1240</guid>
		<description><![CDATA[Wer mit Visual Studio 2010 arbeitet und Visual Studio Productivity Power Tools noch nicht kennt sollte schnellst möglich handeln und sich dieses Add-On installieren, denn es macht die Arbeit mit Visual Studio sehr viel angenehmer (kaum zu glauben dass das eigentlich möglich ist ;-))

Diese Power Tools verbessern hierbei viele Kleinigkeiten, die den Arbeitsprozess angenehmer ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/2010-08-17-09-12-00.png"><img class="alignleft size-full wp-image-1243" title="2010-08-17 09 12 00" src="http://blog.bigbasti.com/uploads/2010-08-17-09-12-00.png" alt="" width="82" height="66" /></a>Wer mit Visual Studio 2010 arbeitet und Visual Studio Productivity Power Tools noch nicht kennt sollte schnellst möglich handeln und sich dieses Add-On installieren, denn es macht die Arbeit mit Visual Studio sehr viel angenehmer (kaum zu glauben dass das eigentlich möglich ist <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</p>
<p>Diese Power Tools verbessern hierbei viele Kleinigkeiten, die den Arbeitsprozess angenehmer machen. Hier ein paar Beispiele:</p>
<ul>
<li>STRG+Mausklick auf eine Variable befördert euch zu der Klasse</li>
<li>STRG+1/2/3 Bringen bequeme Sprungmöglichkeiten innerhalb der markierten Klasse</li>
<li>ALT+Pfeil hoch/runter verschiebt den markierten Text</li>
<li>Ein neuer Solution navigator</li>
<li>Ein verbesserter "Verweis hinzufügen" Dialog mit Suchfunktion</li>
<li>Farbige und pinnbare Tabs</li>
<li>und und und</li>
</ul>
<p><a href="http://visualstudiogallery.msdn.microsoft.com/en-us/d0d33361-18e2-46c0-8ff2-4adea1e34fef" target="_blank">Schnell laden, installieren und genießen!</a> Ich kann schon jetzt nicht mehr ohne! <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1240&amp;md5=b801f6846aea684067db5c37f7f446da" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/add-on-perle-visual-studio-productivity-power-tools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Windows Aero Glas in eigenen Projekten Nutzen Teil 5 &#8211; Der letzte Versuch</title>
		<link>http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-5-der-letzte-versuch/</link>
		<comments>http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-5-der-letzte-versuch/#comments</comments>
		<pubDate>Tue, 20 Jul 2010 20:33:24 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1168</guid>
		<description><![CDATA[In den letzten Tagen habe ich mal wieder ein wenig mit der Windows API herumgespielt, speziell mit der Aero Glas API (DWMAPI). Ich habe euch ja auch noch versprochen einen Beitrag über Steuerelemente in Verbindung mit Glas nachzuliefern. Nunja hier ist er :)
Bild 1: Probleme mit der Transparenz
In Bild 1 sehen wir das Problem, ...]]></description>
			<content:encoded><![CDATA[<p>In den letzten Tagen habe ich mal wieder ein wenig mit der Windows API herumgespielt, speziell mit der Aero Glas API (DWMAPI). Ich habe euch ja auch noch versprochen einen Beitrag über Steuerelemente in Verbindung mit Glas nachzuliefern. Nunja hier ist er <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/glasprobpem1.png"><img class="aligncenter size-full wp-image-1170" title="glasprobpem1" src="http://blog.bigbasti.com/uploads/glasprobpem1.png" alt="" width="447" height="268" /></a><em>Bild 1: Probleme mit der Transparenz</em></p>
<p>In Bild 1 sehen wir das Problem, viele der Windows Forms Steuerelemente nutzen GDI zur Darstellung und haben deswegen keinen Alpha-Kanal, der aber für die Darstellung auf Glas benötigt wird. Deswegen nutzen wir die Schwarze Farbe um unsere Fläche in Glas zu verwandeln, leider denkt der DWM dann, dass auch die Texte auf unseren Steuerelementen zu Glas werden sollen.</p>
<p>Ich habe mich nun ein wenig im Internet umgehört und verschiedene Ansätze gefunden und diverse Hacks mit der Windows32API Ausprobiert, die aber alle leider nicht mehr funktionieren. So will ich euch heute zwei Möglichkeiten vorstellen wie man es doch hinkriegen könnte.</p>
<p><strong>1. Owner Drawing</strong></p>
<p>Da die Steuerelemente mit GDI gerendert werden haben wir ein kleines Problem wie man oben sieht. Also müssen wir die Darstellung der Steuerelemente selbst in die Hand nehmen. Dieser Vorgang nennt sich OwnerDrawing und bedeutet soviel wie "SelberZeichnen". Ich will das Ganze mal anhand einer Textbox demonstrieren.</p>
<p>Und genauso ist auch das Vorgehen. Wir erstellen eine neue Klasse und nennen Sie "AeroTextBox". Diese Klasse erbt nun von der Original TextBox. Nun müssen wir ein paar kleine Änderungen an der Klasse vornehmen in Bezug auf die Darstellung, also des WM_PAINT Ereignisses.</p>
<p>Da wir das Zeichnen des Steuerelements selbst in die Hand nehmen wollen müssen wir die WM_PAINT Message abfangen und auf unsere eigene Methode umleiten:</p>
<p>C#</p>
<pre>
<pre class="brush: csharp; ">

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        base.WndProc( ref m);

        switch (m.Msg)
        {
            case 0xf: //WM_PAINT
                RedrawControlAsBitmap(this.Handle);
                break;
        }
    }
</pre>
</pre>
<p>VB.NET</p>
<pre>
<pre class="brush: vb.net; ">

 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
	MyBase.WndProc(m)

	Select Case m.Msg
		Case &amp;Hf &#039;WM_PAINT
			RedrawControlAsBitmap(Me.Handle)
			Exit Select
	End Select
End Sub
</pre>
</pre>
<p>Wie man sieht fangen wir hier die Message ab und rufen unsere eigene Methode auf, die das Zeichnen übernehmen wird:</p>
<p>C#</p>
<pre>
<pre class="brush: csharp; ">

    public void RedrawControlAsBitmap(IntPtr hwnd)
    {
        Control c = Control.FromHandle(hwnd);
        using (Bitmap bm = new Bitmap(c.Width, c.Height))
        {
            c.DrawToBitmap(bm, c.ClientRectangle);
            using (Graphics g = c.CreateGraphics())
            {
                g.DrawImage(bm, new Point(-1, -1));
            }
        }
        c = null;
    }
</pre>
</pre>
<p>VB.NET</p>
<pre>
<pre class="brush: vb.net; ">

Public Sub RedrawControlAsBitmap(hwnd As IntPtr)
	Dim c As Control = Control.FromHandle(hwnd)

	Using bm As New Bitmap(c.Width, c.Height)
		c.DrawToBitmap(bm, c.ClientRectangle)

		Using g As Graphics = c.CreateGraphics()
			g.DrawImage(bm, New Point(-1, -1))
		End Using
	End Using
	c = Nothing
End Sub
</pre>
</pre>
<p>Was hier passiert ist eigentlich sehr simpel, wir zeichnen das Control neu und legen das gezeichnete Bild nun über das Control drüber. Nur diesmal machen wir das ganze mit einem Alpha Kanal, sodass der DWM uns die Darstellung nicht versaut!</p>
<p>Nun bleibt noch ein kleines Problem, nämlich dass bei manchen Aktionen des Benutzers wie zB. bei MouseOver oder KeyPress Events das Steuerelement neugezeichnet wird und unsere Funktion da oben nicht greift. Hier müssen wir manuell dafür sorgen, dass Windows erneut die WM_PAINT Message versendet. Das erreichen wir indem wir die einzelnen Events überschreiben und die Invalidate()-Methode aufrufen. Diese Methode erklärt die ganze Oberfläche des Steuerelements für ungültig und bewirkt,  dass das Steuerelement neu gezeichnet wird.</p>
<p>C#</p>
<pre>
<pre class="brush: csharp; ">

    protected override void OnMouseClick(System.Windows.Forms.MouseEventArgs e)
    {
        base.OnMouseClick(e);
        Invalidate();
    }

    protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
    {
        base.OnMouseMove(e);
        Invalidate();
    }

    protected override void OnTextChanged(System.EventArgs e)
    {
        base.OnTextChanged(e);
        Invalidate();
    }

    protected override void OnMouseEnter(System.EventArgs e)
    {
        base.OnMouseEnter(e);
        Invalidate();
    }
</pre>
</pre>
<p>VB.NET</p>
<pre>
<pre class="brush: vb.net; ">

Protected Overrides Sub OnMouseClick(e As System.Windows.Forms.MouseEventArgs)
	MyBase.OnMouseClick(e)
	Invalidate()
End Sub

Protected Overrides Sub OnMouseMove(e As System.Windows.Forms.MouseEventArgs)
	MyBase.OnMouseMove(e)
	Invalidate()
End Sub

Protected Overrides Sub OnTextChanged(e As System.EventArgs)
	MyBase.OnTextChanged(e)
	Invalidate()
End Sub

Protected Overrides Sub OnMouseEnter(e As System.EventArgs)
	MyBase.OnMouseEnter(e)
	Invalidate()
End Sub
</pre>
</pre>
<p>Nun wird das Control richtig dargestellt. Wie ihr vielleicht auch gesehen habt haben wir in unserer Methode, die für das Neuzeichnen verantwortlich ist nicht TextBox sondern die Superklasse Control benutzt. Das bedeutet für uns, dass wir mit diesem Code jedes Steuerelement ableiten und auf diese Weise neuzeichnen können mit mehr oder weniger viel Erfolg. Ich habe mal ein paar Klassen abgeleitet und für euch auf dem Glass-Form platziert:</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/glasprobpem2.png"><img class="aligncenter size-full wp-image-1177" title="glasprobpem2" src="http://blog.bigbasti.com/uploads/glasprobpem2.png" alt="" width="454" height="266" /></a><em>Bild 2: Die OwnerDrawn Steuerelemente</em></p>
<p>Wie man sieht ist das schon eine sehr vielversprechende Verbesserung der Darstellung, wenn auch nicht perfekt. Aber natürlich steht es euch noch frei die Darstellung weiter zu verbessern und auf die einzelnen Steuerelemente anzupassen.</p>
<p>Nachdem ihr die selbst erstellten Klassen die von den einzelnen Steuerelementen erben einmal kompiliert habt, wird Visual Studio dies bemerken und euch diese neuen Steuerelemente zusammen mit den anderen in der Toolbox anbieten. Diese können dann wie gewohnt per Drag &amp; Drop auf das Formular gezogen werden.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/glasprobpem3.png"><img class="aligncenter size-full wp-image-1179" title="glasprobpem3" src="http://blog.bigbasti.com/uploads/glasprobpem3.png" alt="" width="454" height="204" /></a><em>Bild 3: Bequemer Gehts nicht</em></p>
<p>Wie ihr euch vorstellen könnt ist es ein ziemlicher Aufwand jedes Steuerelement noch mal neu anzulegen und dessen komplette Darstellung zu übernehmen. Es ist wirklich sehr frickelig! Deswegen wird dieser Ansatz auch eher selten verwendet! Die Demo dazu könnt ihr euch übrigens am Ende des Artikels herunterladen.</p>
<p><strong>Variante 2. "The Microsoft Way"</strong></p>
<p>Natürlich stolpert man irgendwann bei der Recherche über das <a href="http://code.msdn.microsoft.com/WindowsAPICodePack" target="_blank">Windows API SDK</a> in dem es einige Beispiele dazu gibt wie man die neuen Funktionen in Windows benutzt, darunter natürlich auch Glas.</p>
<p>Der Ansatz den Microsoft da aber nach ihrer eigenen Best Practise verwendet ist aber eher ernüchternd. Hier geht es nach dem Motto, platziert einfach keine Steuerelemente auf dem Glas! - Super nicht?</p>
<p>In dem einzigen Beispiel das Microsoft da aufführt wird eine Form gezeigt, dessen Rahmen in das Formular bis zum darauf liegendem Panel erweitert wurde, nicht wirklich spannend. Aber wenn ich so überlege, fällt mit spontan auch kein Windows Programm auf, bei dem irgendwelche Steuerelemente auf dem Glas liegen - kennt ihr welche? In dem meisten Programmen liegen fast nur Grafiken auf dem Glas oder so ähnliche Controls wie die im Windows Explorer.</p>
<p>Also sage ich es mal Microsofts Worten: lasst die Controls vom Glas weg oder benutzt WPF! <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Hier noch die Demo zu der Variante 1:<a href="http://blog.bigbasti.com/aero_controls" target="_blank"> Download [VS 2008 Projekt] </a></p>
<p>Zur zweiten Variante habe ich keine Demo gemacht, ihr könnt euch ja das Windows API SDK herunterladen und dort im Aero Ordner nachgucken.</p>
<p><a href="http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-4-formulare-ohne-border/" target="_self">&lt;&lt; Teil 4 des Tutorials</a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1168&amp;md5=e7a969d9f818d23aff06e03de2dff4f2" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/windows-aero-glas-in-eigenen-projekten-nutzen-teil-5-der-letzte-versuch/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Microsoft SQL CE: Blobs Speichern und auslesen</title>
		<link>http://blog.bigbasti.com/microsoft-sql-ce-blobs-speichern-und-auslesen/</link>
		<comments>http://blog.bigbasti.com/microsoft-sql-ce-blobs-speichern-und-auslesen/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 14:11:25 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Datenbank]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1124</guid>
		<description><![CDATA[In diesem kleinem Tutorial möchte ich euch zeigen, wie man BLOBs (Binary Large Objects) in die Compact Edition vom Microsofts SQL Server speichern und wieder laden kann. Dies soll  eine Art Weiterführung von dem letzten Einstiegspost sein. Ich kann euch aber nicht versprechen, dass noch weitere Beiträge zu dem Thema kommen werden.

Auch wen Relationale ...]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://blog.bigbasti.com/uploads/sqlserver.png" alt="" width="150" height="94" />In diesem kleinem Tutorial möchte ich euch zeigen, wie man BLOBs (Binary Large Objects) in die Compact Edition vom Microsofts SQL Server speichern und wieder laden kann. Dies soll  eine Art Weiterführung von dem <a href="http://blog.bigbasti.com/microsoft-sql-server-compact-edition-eine-einfuehrung/" target="_blank">letzten Einstiegspost</a> sein. Ich kann euch aber nicht versprechen, dass noch weitere Beiträge zu dem Thema kommen werden.</p>
<p>Auch wen <a href="http://de.wikipedia.org/wiki/Relationale_Datenbank" target="_blank">Relationale Datenbanken</a> überwiegend dazu benutzt werden um Text-Basierte Informationen zu speichern, wie Benutzernamen, IP Adressen oder andere Texte, kommt es doch häufiger vor, dass man auch Dateien wie Bilder in eine Datenbank legen möchte. Dies ist zB. nützlich wenn man eine Benutzerdatenbank hat und zu jedem Benutzer ein Bild hinterlegen will.</p>
<p>Das Vorgehen an Sich ist dabei sehr ähnlich, ihr erstellt ein SqlCeCommand und fügt dem wie gewohnt einige Parameter hinzu:</p>
<pre>
<pre class="brush: csharp; ">

                using (SqlCeConnection con = new SqlCeConnection(conString)) {
                    con.Open();
                    using (SqlCeCommand com = new SqlCeCommand
                        (&quot;INSERT INTO cp_image (date, image) VALUES (@Date, @Filename)&quot;, con)) {

                        com.Parameters.AddWithValue(&quot;@Date&quot;, DateTime.Now.ToString());
                        com.Parameters.AddWithValue(&quot;@Filename&quot;,
                                System.IO.File.ReadAllBytes(filename)).SqlDbType = SqlDbType.Image;
                        com.ExecuteNonQuery();
                    }
                }
</pre>
</pre>
<p>Absolut nichts neues wie ihr sehen könnt, wir geben die Datei, die wir anhängen wollen einfach als byte-Array als Parameter mit.</p>
<p>Sehr wichtig ist hierbei folgende Stelle in Zeile 8:</p>
<pre>
<pre class="brush: csharp; ">

.SqlDbType = SqlDbType.Image;
</pre>
</pre>
<p><a href="http://blog.bigbasti.com/uploads/warning_64.png"><img class="alignleft size-full wp-image-1131" title="warning_64" src="http://blog.bigbasti.com/uploads/warning_64.png" alt="" width="64" height="64" /></a>Wenn ihr diese Information nicht mit angebt, werdet ihr Probleme bekommen, sobald ihr eine Datei in die Datenbank schreiben wollt die größer ist als 8 KB!!! Denn wenn man einen Parameter angibt ohne dessen Typ mit anzugeben versucht SQLCE den Typ selbst zu bestimmen und wählt dazu dann den Typ varbinary, dessen Größe auf 8000 Byte beschränkt ist!</p>
<p>Mit dem Ausführen des SqlCeCommands sollte die Datei bzw. das Bild in diesem Fall dann in eure Datenbank Datei wandern.</p>
<p>Das Auslesen der Datei aus der Datenbank gestaltet sich ebenfalls nicht kompliziert. Hier meine Funktion um ein Bild aus der Datenbank zu lesen:</p>
<pre>
<pre class="brush: csharp; ">

        public Image getImageFromDB(int id) {
            Image img;
            byte[] imgData = null;

            using (SqlCeConnection con = new SqlCeConnection(conString)) {
                con.Open();
                using (SqlCeCommand com = new SqlCeCommand
                    (&quot;SELECT image FROM cp_image WHERE id = &#039;&quot; + id.ToString() + &quot;&#039;&quot;, con)) {

                    using (SqlCeDataReader dr = com.ExecuteReader()) {
                        while (dr.Read()) {
                            imgData = (byte[])dr[&quot;image&quot;];
                        }
                    }
                }
            }

            if (imgData != null) {
                //Es wurde ein Bild geladen
                MemoryStream ms = new MemoryStream(imgData);
                img = Image.FromStream(ms);
                return img;
            }
            return null;
        }
</pre>
</pre>
<p>Dazu benutze ich einfach nur einen gewöhnlichen DataAdapter, mit dem ich aus der Spalte namens "image" die Bildinformationen auslese, diese müssen noch in ein byte-Array gecastet werden, da diese als Object geliefert werden.</p>
<p>Zum Schluss wird noch das Byte-Array in ein System.Drawing.Image verwandelt und zurückgegeben. Dies kann man dann zB. direkt in eine PictureBox laden.</p>
<p>Hier ist die Tabelle, die ich in diesem Beispiel benutzt habe:</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/used_table.jpg"><img class="aligncenter size-full wp-image-1136" title="used_table" src="http://blog.bigbasti.com/uploads/used_table.jpg" alt="" width="509" height="162" /></a><em>Bild 1: Tabelleninformationen</em></p>
<p>Wie ihr eine Verbindung zur Datenbank herstellt und normale Select- und Insert-Befehle benutzt könnt ihr im Ersten Teil nachlesen.</p>
<p><a href="http://blog.bigbasti.com/microsoft-sql-server-compact-edition-eine-einfuehrung/">&lt;&lt; Zu Teil 1</a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1124&amp;md5=22c79e095d532b00a9d5786054bc6137" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/microsoft-sql-ce-blobs-speichern-und-auslesen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Microsoft SQL Server Compact Edition &#8211; Eine Einfuehrung</title>
		<link>http://blog.bigbasti.com/microsoft-sql-server-compact-edition-eine-einfuehrung/</link>
		<comments>http://blog.bigbasti.com/microsoft-sql-server-compact-edition-eine-einfuehrung/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 14:49:12 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1057</guid>
		<description><![CDATA[Oft müssen Clientprogramme große Datenmangen speichern, und in den meisten Fällen wird dazu eine Datenbank eingesetzt. Wenn man eine Internetverbindung voraussetzt kann man einen mächtigen Datenbank Server anbinden und die Daten in der Cloud sichern. Doch oft ist eine Offline Lösung viel einfacher und effektiver.

Inzwischen gibt es auch viele verschiedene lokale Datenbanksysteme wie zB. ...]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.bigbasti.com/uploads/sqlserver.png"><img class="alignleft size-full wp-image-1058" title="sqlserver" src="http://blog.bigbasti.com/uploads/sqlserver.png" alt="" width="150" height="94" /></a>Oft müssen Clientprogramme große Datenmangen speichern, und in den meisten Fällen wird dazu eine Datenbank eingesetzt. Wenn man eine Internetverbindung voraussetzt kann man einen mächtigen Datenbank Server anbinden und die Daten in der Cloud sichern. Doch oft ist eine Offline Lösung viel einfacher und effektiver.</p>
<p>Inzwischen gibt es auch viele verschiedene lokale Datenbanksysteme wie zB. SQLite, DB4O oder auch MS SQL Server Compact Edition. Alle diese Serversysteme haben auch den Vorteil, dass diese auf den mobilen Systemen problemlos eingesetzt werden können, haben aber auch den Nachteil, dass sie meist nicht den Vollen Feature Umfang eines <em>echten </em>SQL Servers bieten können.</p>
<p><strong>Vorbereitung</strong></p>
<p>In diesem Artikel soll es um den SQL Server Compact Edition von Microsoft gehen, diesen wollte ich schon immer mal testen und nun hatte ich mal die Zeit dazu.</p>
<p>Sofern ihr es noch nicht habt könnt ihr den SQL CE Server kostenlos bei Microsoft <a href="http://www.microsoft.com/sqlserver/2005/en/us/Compact.aspx" target="_blank">herunterladen</a>. Nach der Installation arbeiten wir wie gewohnt im Visual Studio.</p>
<p><strong>Implementierung</strong></p>
<p>Die ganze Implementierung der Datenbank, Erzeugung der Tabellen sowie die Anbindung erfolgt aus Visual Studio heraus. Die Funktionen die man dort hat sind aber auch  stark von dem Provider abhängig, so bieten verschiedene Provider mehr oder weniger Funktionalität.</p>
<p>Um eine Datenbank zu einem Projekt hinzuzufügen öffnet einfach den Projektmappen-Explorer (Ansicht-&gt;Projektmappen-Explorer) und Klickt mit der rechten Maustaste auf euer Projekt und dann auf "Hinzufügen"-&gt;"Komponente..." und wählt eine Lokale Datenbank aus. In dem Datenbank Assistent Fenster klickt nun 2 Mal auf "Zurück" um auf die erste Seite des Assistenten zu gelangen.</p>
<p>Klickt nun auf "Neue Verbindung". In dem folgendem Fenster sollte man darauf achten, dass als Datenquelle "Microsoft SQL Server Compact 3.5" ausgewählt ist.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/servexpl2.png"><img class="aligncenter size-full wp-image-1065" title="servexpl2" src="http://blog.bigbasti.com/uploads/servexpl2.png" alt="" width="439" height="281" /></a><em>Bild 1: Datenbank Konfiguration</em></p>
<p>Klickt nun auf "Erstellen..." nun solltet ihr das Fenster aus Bild 1 sehen. Wählt oben den Speicherort eurer Datenbank und legt wenn nötig ein Passwort fest um die Datenbank zu verschlüsseln. Bestätigt das Ganze noch zwei Mal mit OK. Visual Studio sollte euch dann darauf hinweisen, dass ihr vorhabt eine Lokale Datenbank zu verwenden und schlägt euch vor diese in euer Projekt zu importieren - das nehmen wir gerne an.</p>
<p>Visual Studio fügt die neu erzeugte Datenbank Datei dem Projekt hinzu und setzt auch die nötigen Verweise auf System.Data und auf System.Data.SqlServerCe.</p>
<p><strong>Anlegen der Tabellen</strong></p>
<p>Beim Anlegen der Tabellen in unserer Datenbank ist uns Visual Studio natürlich ebenfalls sehr behilflich. Öffnet einfach den Server-Explorer (Ansicht-&gt;Server-Explorer) und erweitert eure frisch angelegte Datenbank. (Eventuell müsst ihr auch ein Passwort angeben wenn ihr die Datenbank verschlüsselt habt)</p>
<p>Klickt nun mit der rechten Maustaste auf Tabellen und wählt "Tabelle erstellen" um den Tabellen Assistenten zu starten.</p>
<p style="text-align: center;"><a href="http://blog.bigbasti.com/uploads/servexpl3.png"><img class="aligncenter size-full wp-image-1068" title="servexpl3" src="http://blog.bigbasti.com/uploads/servexpl3.png" alt="" width="450" height="363" /></a><em>Bild 2: Tabellen Assistent</em></p>
<p style="text-align: left;">Hier könnt ihr eure Tabelle anlegen und konfigurieren. Wenn ihr die nun fertige Tabelle im Server-Explorer rechts anklickt und dann "Tabelleneigenschaften" wählt bekommt ihr noch mehr Konfigurationsmöglichkeiten wie etwa Beziehungen.</p>
<p style="text-align: left;">Bereits beim Erstellen der Tabellen ist es euch vielleicht schon aufgefallen, dass es nicht so viele Datentypen zur Auswahl gibt wie in einem richtigen SQL Server aber das sind nicht die einzigen Einschränkungen...</p>
<p style="text-align: left;"><strong>Arbeiten mit der Datenbank</strong></p>
<p style="text-align: left;">Das Arbeiten mit der Datenbank gestaltet sich nicht anders als mit anderen Datenbanken. Die Objekte die man dafür benötigt heißen sogar fast gleich. Alle Klasse die man nutzt haben noch den Zusatz "Ce", also statt "SqlCommand" heißt es nun "SqlCeCommand".</p>
<p style="text-align: left;">Und auch die Nutzung unterscheidet sich nur geringfügig:</p>
<p style="text-align: left;">
<p>Datenbank Verbindung herstellen:</p>
<pre>
<pre class="brush: csharp; ">

        private SqlCeConnection con;
        private string dbLocation = Environment.CurrentDirectory + &quot;\\clipboard.sdf&quot;;
        private string conString;

        private void connectDB(){
            conString = &quot;Data Source=\&quot;&quot; + dbLocation + &quot;\&quot;; Password=\&quot;bigbasti.com\&quot;; Encrypt=True&quot;;
            con = new SqlCeConnection(conString);
            con.Open();
        }
</pre>
</pre>
<p>Eine Select Abfrage durchführen:</p>
<pre>
<pre class="brush: csharp; ">

        ///
        /// Führt einen Select Befehl auf der Datenbank aus und gibt das ergebnis in einer DataTable zurück
        ///
        ///Der auszuführende Befehl
        /// Return: Ein DataTable mit den ausgelesenen Daten
        public DataTable executeSelect(string query) {
            connectDB();
            DataTable dt = new DataTable();
            SqlCeCommand com = new SqlCeCommand(query, con);
            SqlCeDataAdapter sad = new SqlCeDataAdapter(com);

            sad.Fill(dt);
            con.Close();
            return dt;
        }

        public int checkDouble(string link, string date) {
            int retVal;
            using (SqlCeConnection con = new SqlCeConnection(conString)) {
                con.Open();

                //Doppelte Einträge verhindern
                DataTable dt = executeSelect(&quot;SELECT * FROM cp_link WHERE link LIKE &#039;&quot; + link + &quot;&#039;&quot;);
                if (dt.Rows.Count &gt; 0) {
                    executeNonQuery(&quot;DELETE FROM cp_link WHERE link LIKE &#039;&quot; + link + &quot;&#039;&quot;);
                }
            }
            return retVal;
        }
</pre>
</pre>
<p>UPDATE, DELETE und INSERT:</p>
<pre>
<pre class="brush: csharp; ">

        ///
        /// Executes an SQL statement against the SqlCeConnection and returns
        /// the number of rows affected.You also can use ExecuteNonQuery to
        /// change the data in a database without using a DataSet by executing
        /// UPDATE, INSERT, or DELETE statements.
        ///
        ///Der Befehl der ausgeführt werden soll
        /// The number of rows affected.
        public int executeNonQuery(string q) {
            int retVal;
            using (SqlCeConnection con = new SqlCeConnection(conString)) {
                con.Open();
                using (SqlCeCommand com = new SqlCeCommand(q, con)) {
                    retVal = com.ExecuteNonQuery();
                }
            }
            return retVal;
        }
        public int doSomeInsert(string link, string date) {
            int retVal;
            using (SqlCeConnection con = new SqlCeConnection(conString)) {
                con.Open();
                using (SqlCeCommand com = new SqlCeCommand(&quot;INSERT INTO cp_link  (link, date) VALUES (@link, @date )&quot;, con)) {
                    com.Parameters.AddWithValue(&quot;@link&quot;, link);
                    com.Parameters.AddWithValue(&quot;@date&quot;, date);
                    retVal = com.ExecuteNonQuery();
                }
            }
            return retVal;
        }
</pre>
</pre>
<p>Hier gibts eigentlich nichts besonderes. Leider hat man hier, da es eine Compact Edition ist nicht so viele Befehle zur Verfügung wie im Original. So fehlt zB. auch der TRUNCAT Befehl wie ich erstaunt feststellen musste. Ich habe da nicht noch weiter recherchiert was noch alles fehlt, da ich für das was ich gemacht habe keine besonderen Aktionen benötigte.</p>
<p><strong>Deployment</strong></p>
<p>Wenn ihr das Projekt über ein Setup-Projekt deployen wollt dann sollte da eigentlich nichts schief gehen. Ihr könnt aber natürlich auch ohne ein extra Setup-Projekt deployen, dazu solltet ihr folgende Schritte machen:<a href="http://blog.bigbasti.com/uploads/assasasd.png"><img class="alignleft size-full wp-image-1079" title="assasasd" src="http://blog.bigbasti.com/uploads/assasasd.png" alt="" width="187" height="258" /></a></p>
<ol>
<li>Öffnet die Eigenschaften eures Projekts</li>
<li>Öffnet dort den "Veröffentlichen" (Publish) Tab</li>
<li>Klickt auf den Knopf "Erforderliche Komponenten"</li>
<li>Sucht den Eintrag "SQL Server Compact Edition 3.5" und entfernt das Häkchen und schließt die Eigenschaften</li>
<li>Nun benötigen wir die erforderlichen DLL Dateien, diese liegen in "C:\Programe\Microsoft SQL Server Compact Edition\"</li>
<li>Es sind 7 oder auch mehr Dateien, abhängig davon wie viele Sprachen installiert sind (siehe Bild links)</li>
<li>Markiert diese DLLs und zieht diese direkt in den Projektmappen-Explorer, da mit diese DLLs dem Projekt hinzugefügt werden</li>
<li>Markiert die neuen DLLs in dem Projektmappen-Explorer -&gt; klickt mit der rechten Maustaste darauf und wählt "Eigenschaften"</li>
<li>Setzt die Eigenschaft "In Ausgabeverzeichnis kopieren" auf "Kopieren, wenn neuer" damit ihr immer die Aktuelle Version im Build Verzeichnis habt</li>
<li>Klickt im Projektmappen-Explorer mit der rechten Maustaste auf System.Data.SqlServerCe und wählt Eigenschaften</li>
<li>Setzt hier die Eigenschaft "Lokale Kopie" auf True. Dieser Schritt ist nötig damit das Programm lokal nach der DLL sucht und nicht versucht sich diese aus dem GAC (Global Assembly Cache) zu holen.</li>
</ol>
<p>Und das war es eigentlich schon. Nun könnt ihr das Projekt problemlos deployen.</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1057&amp;md5=4d768272e683de291062ae9eaf015250" title="Flattr" target="_blank"><img src="http://blog.bigbasti.com/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.bigbasti.com/microsoft-sql-server-compact-edition-eine-einfuehrung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

