<?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>BigBastis Blog &#187; .NET</title>
	<atom:link href="http://blog.bigbasti.com/category/net/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.bigbasti.com</link>
	<description>About Me &#38; my Digital Lifestyle</description>
	<lastBuildDate>Wed, 02 May 2012 12:27:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>ASP.NET MVC Security Teil 2: Unnoetige HTTP Response-Header entfernen</title>
		<link>http://blog.bigbasti.com/asp-net-mvc-security-teil-2-unnoetige-http-response-header-entfernen/</link>
		<comments>http://blog.bigbasti.com/asp-net-mvc-security-teil-2-unnoetige-http-response-header-entfernen/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 08:02:05 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Gut zu Wissen]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=2040</guid>
		<description><![CDATA[In dieser Reihe von Posts möchte ich Wege zum Absichern einer MVC Anwendung zeigen, die man gerne mal vergisst oder als Neueinsteiger nicht gleich auf dem Schirm hat.

Teil 2: Unnötige HTTP Response-Header entfernen

Wenn wir im Internet surfen werden oft Informationen über uns ohne unser Zutun bei jedem Request an den Server übertragen. Dies geschieht ...]]></description>
			<content:encoded><![CDATA[<p>In dieser Reihe von Posts möchte ich Wege zum Absichern einer MVC Anwendung zeigen, die man gerne mal vergisst oder als Neueinsteiger nicht gleich auf dem Schirm hat.</p>
<p><strong>Teil 2: Unnötige HTTP Response-Header entfernen</strong></p>
<p>Wenn wir im Internet surfen werden oft Informationen über uns ohne unser Zutun bei jedem Request an den Server übertragen. Dies geschieht über die HTTP-Header. So wird z.B. die Adresse der Seite auf der wir einen Link geklickt haben in dem Referrer-Header an den Server übertragen.</p>
<p>Aber auch die Server selbst sind in dieser Sache oft sehr gesprächig und verraten mehr über sich als wirklich nötig ist.</p>
<div class="wp-caption aligncenter" style="width: 519px"><a href="http://server.bigbasti.com/uploads/uploads/54212998197156.png "><img title="HTTP-Response Header" src="http://server.bigbasti.com/uploads/uploads/54212998197156.png " alt="" width="509" height="163" /></a><p class="wp-caption-text">Eine Typische ASP.NET Serverantwort</p></div>
<p>In dem Bild sieht man (rot eingerahmt) Informationen die der Server über unsere Anwendung nach außen gibt, die eigentlich lieber geheim bleiben sollten.</p>
<p><strong>Warum ist das gefährlich?</strong></p>
<p>Die Informationen, die hier angezeigt werden verraten die Version des Servers, der Laufzeitumgebung und die Version des Frameworks, das wir benutzen. In diesem Fall ASP.NET MVC 3.</p>
<p>Falls nun bekannt wird, dass der Server oder ASP.NET in dieser Version eine Sicherheitslücke aufweist, sieht ein potentieller Angreifer sofort, dass unsere Seite für eine Attacke anfällig ist.</p>
<p>Es gibt sogar extra Tools, die das Web nach Webseiten durchsuchen, die eine Serverversion aufweisen, die als unsicher eingestuft wird oder für die es bekannte Lücken gibt. Diese Tools nutzen unter Anderem dann auch diese Informationen um zu prüfen ob es sich lohnt bei dieser Seite einen Angriff zu starten.</p>
<p><strong>Was nun?</strong></p>
<p>Im Grunde ist die Aufgabe sehr einfach, wir müssen diese unnötigen Serverheader ausblenden. Wenn die Webseite dann keine anderen Frameworkspezifischen Merkmale aufweist (wie z.B. einen Viewstate) ist es für einen Besucher praktisch unmöglich herauszufinden, welcher Server und welches Framework im Backend laufen.</p>
<p><strong>Die Umsetzung</strong></p>
<p>Leider ist ASP.NET in dieser Hinsicht noch nicht so richtig benutzerfreundlich, denn um all diese Header zu entfernen müssen wir an einigen verschiedenen Stellen Änderungen vornehmen. Gehen wir mal Schritt für Schritt alles durch.</p>
<p><span style="text-decoration: underline;">1. ASP.NET &amp;  MVC Header</span></p>
<p>Diesen Header können wir recht einfach entfernen, indem wir in der global.asax die nötige Property setzen:</p>
<pre>
<pre class="brush: csharp; ">

protected void Application_Start()
{
    MvcHandler.DisableMvcResponseHeader = true; //&lt;- Hier

    AreaRegistration.RegisterAllAreas();

    Database.SetInitializer(new F1DBInitializer());

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
</pre>
</pre>
<p>Dies hat schon eine Gute Wirkung auf unsere Response Header:</p>
<div class="wp-caption aligncenter" style="width: 397px"><a href="http://server.bigbasti.com/uploads/uploads/5421292223216538.png "><img title="Verbliebene Responseheader" src="http://server.bigbasti.com/uploads/uploads/5421292223216538.png " alt="" width="387" height="131" /></a><p class="wp-caption-text">Verbliebene Response Header</p></div>
<p>Die Version von ASP.NET und des MVC Frameworks wird nun nicht mehr angezeigt. Nun zu den anderen.</p>
<p><span style="text-decoration: underline;">2. X-Powered-By Header</span></p>
<p>Um diesen Header zu entfernen müssen wir unsere web.config ergänzen (<a href="http://code-inside.de/blog/2011/09/30/security-tipp-x-powered-by-header-und-server-header-bei-asp-net-mvc-iis-entfernen/" target="_blank">Quelle</a>):</p>
<pre>
<pre class="brush: xml; ">

&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;configuration&gt;

  &lt;system.web&gt;
    &lt;httpRuntime enableVersionHeader=&quot;false&quot; /&gt;
    ...
  &lt;/system.web&gt;

  &lt;system.webServer&gt;
    ...
    &lt;httpProtocol&gt;
      &lt;customHeaders&gt;
        &lt;remove name=&quot;X-Powered-By&quot; /&gt;
      &lt;/customHeaders&gt;
    &lt;/httpProtocol&gt;
  &lt;/system.webServer&gt;

 ...
&lt;/configuration&gt;
</pre>
</pre>
<p>Dann verabschiedet sich auch dieser Header.</p>
<div class="wp-caption aligncenter" style="width: 408px"><a href="http://server.bigbasti.com/uploads/uploads/5421293211159876.png "><img title="X-Powered-By nun auch weg" src="http://server.bigbasti.com/uploads/uploads/5421293211159876.png " alt="" width="398" height="112" /></a><p class="wp-caption-text">Und auch X-Powered-By ist nun weg</p></div>
<p><span style="text-decoration: underline;">3. Einer geht noch: Der Server-Header</span></p>
<p>Dies geht leider nicht so einfach durch das Setzen eines Configparameters, hier müssen wir selbst Hand anlegen und diesen Header aus der Response löschen. Dazu schreiben wir uns ein eigenes HttpModul (<a href="http://code-inside.de/blog/2011/09/30/security-tipp-x-powered-by-header-und-server-header-bei-asp-net-mvc-iis-entfernen/" target="_blank">Quelle</a>):</p>
<pre>
<pre class="brush: csharp; ">

public class RemoveServerHeaderModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose()
    { }

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Headers.Remove(&quot;Server&quot;);
    }
}
</pre>
</pre>
<p>Anschließend müssen wir das neue Modul über die web.config registrieren (<a href="http://code-inside.de/blog/2011/09/30/security-tipp-x-powered-by-header-und-server-header-bei-asp-net-mvc-iis-entfernen/" target="_blank">Quelle</a>):</p>
<pre>
<pre class="brush: xml; ">

&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;configuration&gt;
  ...
  &lt;system.webServer&gt;
    &lt;validation validateIntegratedModeConfiguration=&quot;false&quot;/&gt;
    &lt;modules runAllManagedModulesForAllRequests=&quot;true&quot;&gt;
      &lt;add name=&quot;RemoveServerHeaderModule&quot; type=&quot;SecurityTipp.RemoveServerHeaderModule&quot;/&gt;
    &lt;/modules&gt;
	...
  &lt;/system.webServer&gt;

&lt;/configuration&gt;
</pre>
</pre>
<p>Das Ergebnis:</p>
<div class="wp-caption aligncenter" style="width: 470px"><a href="http://server.bigbasti.com/uploads/uploads/54212952553878815.png "><img title="Fertig" src="http://server.bigbasti.com/uploads/uploads/54212952553878815.png " alt="" width="460" height="104" /></a><p class="wp-caption-text">Alle unnötigen Header sind raus</p></div>
<p>Nun haben wir unser Ziel erreicht und alle Plaudertaschen aus der Response entfernt <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Weitergedacht</strong></p>
<p>Hier könnte man nun ansetzen und sogar versuchen den potentiellen Angreifer in die Irre zu führen, indem man einen modifizierten Server-Header zurückgibt der auf eine Ganz andere Serversoftware verweist, Apache oder sowas <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Das Schöne hierbei ist weiterhin, dass wir alle diese Änderungen innerhalb unserer App machen können und nicht im IIS rumfummeln müssen. Einerseits weil man da viel kaputtkonfigurieren kann, andererseits weil man nicht immer Zugriff auf den IIS hat, wenn man z.B. nur ein Webspace hat.</p>
<p>Diese Schritte sollten bei jeder Anwendung durchgeführt werden, egal ob MVC, ASP.NET oder PHP, gebt den Besuchern nicht mehr Informationen als sie unbedingt benötigen!</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.bigbasti.com%2fasp-net-mvc-security-teil-2-unnoetige-http-response-header-entfernen%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.bigbasti.com%2fasp-net-mvc-security-teil-2-unnoetige-http-response-header-entfernen%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=2040&amp;md5=a07e06fd6b2af3eaa7e6a09d0da9fcc7" 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-security-teil-2-unnoetige-http-response-header-entfernen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC Security Teil 1: Das AntiForgeryToken nutzen</title>
		<link>http://blog.bigbasti.com/asp-net-mvc-security-teil-1-das-antiforgerytoken-nutzen/</link>
		<comments>http://blog.bigbasti.com/asp-net-mvc-security-teil-1-das-antiforgerytoken-nutzen/#comments</comments>
		<pubDate>Wed, 04 Apr 2012 13:24:58 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[Gut zu Wissen]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=2025</guid>
		<description><![CDATA[In dieser Reihe von Posts möchte ich Wege zum Absichern einer MVC Anwendung zeigen, die man gerne mal vergisst oder als Neueinsteiger nicht gleich auf dem Schirm hat.

Teil 1: Nutzen des AntiForgeryToken bei POST Requests

POST Requests sind gefährlich, da diese im Normalfall dafür verwendet werden dem Server Informationen mitzuteilen. Die Informationen sollte man natürlich prüfen, ...]]></description>
			<content:encoded><![CDATA[<p>In dieser Reihe von Posts möchte ich Wege zum Absichern einer MVC Anwendung zeigen, die man gerne mal vergisst oder als Neueinsteiger nicht gleich auf dem Schirm hat.</p>
<p><strong>Teil 1: Nutzen des AntiForgeryToken bei POST Requests</strong></p>
<p>POST Requests sind gefährlich, da diese im Normalfall dafür verwendet werden dem Server Informationen mitzuteilen. Die Informationen sollte man natürlich prüfen, auf Form und Inhalt, aber noch wichtiger ist es, zu wissen wer uns diese Daten sendet. (Cross-Site-Attacken verhindern)</p>
<p><strong>Wie funktioniert das?</strong></p>
<p>Mit dem AntiForgeryToken können wir an dieser Stelle sichergehen, dass nur Formulare am Server angenommen werden, die der Server selbst erzeugt hat.<br />
Dabei erzeugt der Server beim Generieren des Formulars einen Token und speichert diesen in einem <strong>versteckten Input-Feld</strong> (__RequestVerificationToken), des Weiteren wird auch ein <strong>Cookie</strong> namens "__RequestVerificationToken" mit dem gleichen Token angelegt, sodass beim Absenden des Formulars sowohl der Cookie als auch das versteckte Feld wieder zurück an den Server übertragen wird.</p>
<p>Wenn der Server diesen Request empfängt prüft er diesen Token aus dem versteckten Feld gegen das Token aus dem Cookie. Gibt es hier keine Übereinstimmung wird der Request abgewiesen.</p>
<p><strong>Wie wird das implementiert?</strong></p>
<p>Als Erstes muss das Token in das Formular gesetzt werden und das Cookie erzeugt werden. Diese Aufgabe übernimmt für und der kleine <a href="http://msdn.microsoft.com/de-de/library/system.web.mvc.htmlhelper.antiforgerytoken.aspx" target="_blank">Html-Helper</a> aus MVC.</p>
<pre>
<pre class="brush: html; ">

&lt;div class=&quot;myForm&quot;&gt;
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()

        &lt;!-- REST DES FORMULARS --&gt;
    }
&lt;/div&gt;
</pre>
</pre>
<p>Das ging ja einfach, nun müssen wir dafür sorgen, dass dieses Token beim Verarbeiten des Requests auch geprüft wird.</p>
<pre>
<pre class="brush: csharp; ">

[ValidateAntiForgeryToken]
public ActionResult UpdateStuff()
{
...
}
</pre>
</pre>
<p>Mehr ist das nicht, ein einfaches <a href="http://msdn.microsoft.com/de-de/library/system.web.mvc.validateantiforgerytokenattribute.aspx" target="_blank">Attribut</a> genügt, und unsere MVC Anwendung ist mit nur zwei Zeilen sicherer geworden.</p>
<p>Wenn Ihr nun einen Blick in euer gerendertes Formular werft, werdet ihr etwas in der Art finden:</p>
<pre>
<pre class="brush: html; ">

&lt;input name=&quot;__RequestVerificationToken&quot; type=&quot;hidden&quot; value=&quot;4PhvBw7EO5I3O4zw2cdYkaEfSJycy1Ugi8AOT6glW6IqZNnVKXTzL52LgQGNMviOhYTxAOQH3iZRtehUoHKRprcHXa8YNel6RzVmKjGAEi0W0duRpnwJu9EpR7ybAoZX9yqeiP3Pyng/ma1t/k6QhM2bbcoBgkou5y0KXEj8Ut8=&quot; /&gt;
</pre>
</pre>
<p><strong>Gibt es Einschränkungen?</strong></p>
<ul>
<li>Da hier ein Cookie gesetzt wird müssen natürlich Cookies aktiviert sein da der Server sonst alle Requests abweisen wird.</li>
<li>Das Ganze funktioniert nur mit POST Requests, was auch logisch ist, da GET Requests nur zum Abfragen von Informationen genutzt werden sollten.</li>
</ul>
<p><strong>Alternativen?</strong></p>
<p><strong></strong>Wenn man keine Cookies nutzen will kann man ein ähnliches Verhalten hervorrufen, indem man prüft ob der eingehende Request ein Referrer-Header besitzt der auf unsere eigene Domain + URL verweist.<br />
Dies ist natürlich nicht wirklich Sicher, da es leicht zu fälschen ist und außerdem haben manche Browser Anonymisierungsfunktionen die diese Header-Felder nicht mitsenden, also ist hier Vorsicht geboten.</p>
<div>
<p><strong>Zusammenfassung</strong></p>
<p>Das AntiForgeryToken bietet einen recht guten Schutz vor Cross-Site-Attacken bei sehr sehr einfacher und schneller Implementierung.</p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.bigbasti.com%2fasp-net-mvc-security-teil-1-das-antiforgerytoken-nutzen%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.bigbasti.com%2fasp-net-mvc-security-teil-1-das-antiforgerytoken-nutzen%2f" border="0" alt="kick it on dotnet-kicks.de" /></a></p>
</div>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=2025&amp;md5=5b03d6ba2a690341c3f4284c420f3d66" 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-security-teil-1-das-antiforgerytoken-nutzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chart helper in ASP.NET MVC nutzen</title>
		<link>http://blog.bigbasti.com/chart-helper-in-asp-net-mvc-nutzen/</link>
		<comments>http://blog.bigbasti.com/chart-helper-in-asp-net-mvc-nutzen/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 10:57:12 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[CSharp]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=2013</guid>
		<description><![CDATA[Vor einer Weile habe ich ein kleines Tutorial geschrieben wie ihr das kostenlose MSChart Control benutzen könnt um euch hübsche Grafen zeichnen zu lassen.

ASP.NET MVC 3 bietet euch einen Helper der eine sehr ähnliche Funktionalität bietet und sehr einfach in eure MVC Anwendung zu integrieren ist.

Das Schöne ist, dass wenn ihr das aktuelle Visual ...]]></description>
			<content:encoded><![CDATA[<p>Vor einer Weile habe ich ein<a href="http://blog.bigbasti.com/net-charts-und-diagramme-mit-mschart-erstellen/" target="_blank"> kleines Tutorial geschrieben</a> wie ihr das kostenlose MSChart Control benutzen könnt um euch hübsche Grafen zeichnen zu lassen.</p>
<p>ASP.NET MVC 3 bietet euch einen Helper der eine sehr ähnliche Funktionalität bietet und sehr einfach in eure MVC Anwendung zu integrieren ist.</p>
<p>Das Schöne ist, dass wenn ihr das aktuelle <a href="http://haacked.com/archive/2011/04/12/introducing-asp-net-mvc-3-tools-update.aspx" target="_blank">Visual Studio Tools update installiert</a> habt, ihr diesen Helper bereits out of the box nutzen. Falls nicht könnt ihr es über das<a href="https://nuget.org/packages/microsoft-web-helpers" target="_blank"> NuGet Paket</a> bequem nachinstallieren.</p>
<p>Hier ein kleines Beispiel wie eine Action aussehen kann, die ein Chart erzeugen soll:</p>
<div class="wp-caption aligncenter" style="width: 437px"><a href="http://server.bigbasti.com/uploads/uploads/1532121138185778847.png "><img class=" " src="http://server.bigbasti.com/uploads/uploads/1532121138185778847.png " alt="" width="427" height="215" /></a><p class="wp-caption-text">Beispiel 1</p></div>
<pre>
<pre class="brush: csharp; ">

    public ActionResult CreateChart()
    {
        Chart bytes = new Chart(width: 400, height: 200)
            .AddSeries(
                chartType: &quot;column&quot;,
                xValue: new[] { &quot;Wert1&quot;, &quot;Wert2&quot;, &quot;Wert3&quot;, &quot;Wert4&quot; },
                yValues: new[] { &quot;12&quot;, &quot;3&quot;, &quot;23&quot;, &quot;11&quot; })
            .AddSeries(
                chartType: &quot;column&quot;,
                xValue: new[] { &quot;Wert1&quot;, &quot;Wert2&quot;, &quot;Wert3&quot;, &quot;Wert4&quot; },
                yValues: new[] { &quot;13&quot;, &quot;32&quot;, &quot;23&quot;, &quot;5&quot; });

            return File(bytes.GetBytes(&quot;png&quot;), &quot;image/png&quot;);
    }
</pre>
</pre>
<p>Wie man sieht wird hier nachdem das Chart erstellt wurde eine Grafik daraus gemacht und diese dann an die View zur Anzeige gesendet. Der Aufruf in der View ist dementsprechend simpel:</p>
<pre>
<pre class="brush: html; ">

&lt;img src=&quot;@Url.Action(&quot;CreateChart&quot;)&quot; alt=&quot;Beschreibung&quot; /&gt;
</pre>
</pre>
<p>Was vielleicht nicht auf den ersten Blick ersichtlich ist, ist wie man eine legende zu dem Chart anzeigen lassen kann. Dazu muss jede "Serie" einen namen erhalten und zum Schluss kann man dann die "AddLegend()" Methode ohne Parameter aufrufen:</p>
<div class="wp-caption aligncenter" style="width: 433px"><a href="http://server.bigbasti.com/uploads/uploads/15321211462369397.png "><img src="http://server.bigbasti.com/uploads/uploads/15321211462369397.png " alt="" width="423" height="222" /></a><p class="wp-caption-text">Beispiel 2</p></div>
<pre>
<pre class="brush: csharp; ">

    public ActionResult CreateChart()
    {
        Chart chart = new Chart(width: 400, height: 200)
            .AddSeries(
                chartType: &quot;column&quot;,
                xValue: new[] { &quot;Wert1&quot;, &quot;Wert2&quot;, &quot;Wert3&quot;, &quot;Wert4&quot; },
                name: &quot;Serie 1&quot;,
                yValues: new[] { &quot;12&quot;, &quot;3&quot;, &quot;23&quot;, &quot;11&quot; })
            .AddSeries(
                chartType: &quot;column&quot;,
                xValue: new[] { &quot;Wert1&quot;, &quot;Wert2&quot;, &quot;Wert3&quot;, &quot;Wert4&quot; },
                name: &quot;Serie 2&quot;,
                yValues: new[] { &quot;13&quot;, &quot;32&quot;, &quot;23&quot;, &quot;5&quot; });

        chart.AddLegend();

        return File(chart.GetBytes(&quot;png&quot;), &quot;image/png&quot;);
    }
</pre>
</pre>
<p>Noch etwas umständlicher wird es, wenn man nun die legende an eine andere Stelle setzen will, denn hier muss ein eigenes Theme her. Dieses sollte dann auch nur die Felder enthalten die man ändern will. Wenn man z.B. die legende unten angezeigt haben möchte kann man so vorgehen:</p>
<div class="wp-caption aligncenter" style="width: 421px"><a href="http://server.bigbasti.com/uploads/uploads/1532121152231379397.png "><img src="http://server.bigbasti.com/uploads/uploads/1532121152231379397.png " alt="" width="411" height="205" /></a><p class="wp-caption-text">Beispiel 3</p></div>
<pre>
<pre class="brush: csharp; ">

        public ActionResult CreateChart()
        {
            string theme = @&quot;&lt;Chart BackColor=&quot;&quot;WhiteSmoke&quot;&quot; &gt;
                                    &lt;ChartAreas&gt;
                                        &lt;ChartArea Name=&quot;&quot;Default&quot;&quot; BackColor=&quot;&quot;White&quot;&quot;&gt;
                                    &lt;/ChartAreas&gt;
                                    &lt;Legends&gt;
                                        &lt;Legend _Template_=&quot;&quot;All&quot;&quot; BackColor=&quot;&quot;Transparent&quot;&quot; Font=&quot;&quot;Trebuchet MS, 9pt&quot;&quot; IsTextAutoFit=&quot;&quot;False&quot;&quot; Docking=&quot;&quot;Bottom&quot;&quot; /&gt;
                                    &lt;/Legends&gt;
                                &lt;/Chart&gt;&quot;;

            Chart chart = new Chart(width: 400, height: 200, theme: theme)
                .AddSeries(
                    chartType: &quot;column&quot;,
                    xValue: new[] { &quot;Wert1&quot;, &quot;Wert2&quot;, &quot;Wert3&quot;, &quot;Wert4&quot; },
                    name: &quot;Serie 1&quot;,
                    yValues: new[] { &quot;12&quot;, &quot;3&quot;, &quot;23&quot;, &quot;11&quot; })
                .AddSeries(
                    chartType: &quot;column&quot;,
                    xValue: new[] { &quot;Wert1&quot;, &quot;Wert2&quot;, &quot;Wert3&quot;, &quot;Wert4&quot; },
                    name: &quot;Serie 2&quot;,
                    yValues: new[] { &quot;13&quot;, &quot;32&quot;, &quot;23&quot;, &quot;5&quot; });

            chart.AddLegend();

            return File(chart.GetBytes(&quot;png&quot;), &quot;image/png&quot;);
        }
</pre>
</pre>
<p>Man beachte hier dass dem Chart-Konstruktor ein weiterer Parameter "theme" übergeben wird.</p>
<p>Im Grunde wars das auch schon. An der Handhabung ändert sich nicht viel. Falls ihr euch irgendwo vertippt wird übrigens einfach kein Bild erzeugt, also vorsicht beim Tippen <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=2013&amp;md5=f66bb2a66235ed093965116be652dd3d" 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/chart-helper-in-asp-net-mvc-nutzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET: Verbindungsname LocalSqlServer wurde in der Anwendungskonfiguration nicht gefunden</title>
		<link>http://blog.bigbasti.com/asp-net-verbindungsname-localsqlserver-wurde-in-der-anwendungskonfiguration-nicht-gefunden/</link>
		<comments>http://blog.bigbasti.com/asp-net-verbindungsname-localsqlserver-wurde-in-der-anwendungskonfiguration-nicht-gefunden/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 09:40:31 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Error]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1999</guid>
		<description><![CDATA[Am Wochenende hatte ich einen interessanten Fehler in meiner ASP.NET MVC Anwendung. Dieser tauchte auf nachdem die Anwendung schon einige Wochen Problemlos lief. Es handelte sich um diesen Fehler:
Konfigurationsfehler

Beschreibung: Fehler beim Verarbeiten einer Konfigurationsdatei, die für diese Anforderung erforderlich ist. Überprüfen Sie die unten angegebenen Fehlerinformationen, und ändern Sie die Konfigurationsdatei entsprechend.

Parserfehlermeldung: Der Verbindungsname LocalSqlServer wurde ...]]></description>
			<content:encoded><![CDATA[<p>Am Wochenende hatte ich einen interessanten Fehler in meiner ASP.NET MVC Anwendung. Dieser tauchte auf nachdem die Anwendung schon einige Wochen Problemlos lief. Es handelte sich um diesen Fehler:</p>
<blockquote><p><span style="color: #800000; font-size: 2em;"><em>Konfigurationsfehler</em></span></p>
<p><strong>Beschreibung: </strong>Fehler beim Verarbeiten einer Konfigurationsdatei, die für diese Anforderung erforderlich ist. Überprüfen Sie die unten angegebenen Fehlerinformationen, und ändern Sie die Konfigurationsdatei entsprechend.</p>
<p><strong>Parserfehlermeldung: </strong>Der Verbindungsname LocalSqlServer wurde in der Anwendungskonfiguration nicht gefunden, oder die Verbindungszeichenfolge war leer.</p></blockquote>
<p>Das Problem ist hier, dass das ASP.NET Membership per Default in der root web.config so konfiguriert ist, dass es den Connectionstring "LocalSqlServer" nutzen soll. Dieser Connectionstring zeigt dann (meistens) auf eine SQL Datenbank die auf dem Hostingsystem (noch) nicht verfügbar ist. An dieser Stelle knallt es dann.</p>
<p>Die einfachste Lösung für dieses Problem ist es den Connectionstring neu zusetzen. Dazu entfernt man erst den Defaulteintrag und setzt den neuen dann auf eine gültige Datenbankverbindung:</p>
<pre>
<pre class="brush: xml; ">

	&lt;remove name=&quot;LocalSqlServer&quot; /&gt;
	&lt;add name=&quot;LocalSqlServer&quot;
		connectionString=&quot;[EUER CONNECTIONSTRING]&quot;
		providerName=&quot;System.Data.SqlClient&quot; /&gt;
</pre>
</pre>
<p>Dies hat das Problem behoben, sodass die Anwendung wieder wie gewohnt lief.</p>
<p>Was mir noch ein wenig Kopfschmerzen bereitet, ist dass ich das ASP.NET Membership gar nicht nutze und auch keinen "LocalSqlServer" Connectionstring habe. Des Weiteren lief die Anwendung erst wochenlang und plötzlich kam dann dieser Fehler.</p>
<p>Wenn ihr diesen Fehler vielleicht schon kennt oder euch noch was dazu einfällt würde ich mich über einen Kommentar mit einem Tipp freuen.</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1999&amp;md5=47d2df44ce2509f5c1352f710760b93e" 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-verbindungsname-localsqlserver-wurde-in-der-anwendungskonfiguration-nicht-gefunden/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aktuelle Zeile bei Kommandozeilen Applikationen aktualisieren</title>
		<link>http://blog.bigbasti.com/aktuelle-zeile-bei-kommandozeilen-applikationen-aktualisieren/</link>
		<comments>http://blog.bigbasti.com/aktuelle-zeile-bei-kommandozeilen-applikationen-aktualisieren/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 13:38:40 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Gut zu Wissen]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1992</guid>
		<description><![CDATA[Vielleicht ist euch das ja auch schon Mal passiert, ihr entwickelt eine Kommandozeilen-App und wollt die Aktuelle Zeile ändern. Ein Beispiel dafür wäre ein Fortschrittsbalken oder der beliebte Command-Line-Spinner ( bestehend aus den Zeichen /, -, \, &#124;. Wenn diese nacheinander angezeigt werden sieht das so aus wie ein sich drehender Ast :)

Das Ganze ...]]></description>
			<content:encoded><![CDATA[<p>Vielleicht ist euch das ja auch schon Mal passiert, ihr entwickelt eine Kommandozeilen-App und wollt die Aktuelle Zeile ändern. Ein Beispiel dafür wäre ein Fortschrittsbalken oder der beliebte Command-Line-Spinner ( bestehend aus den Zeichen /, -, \, |. Wenn diese nacheinander angezeigt werden sieht das so aus wie ein sich drehender Ast <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Das Ganze kann in allen Kommandozeilenfenstern, egal ob Unix oder Windows implementiert werden. Der Schlüssel hierzu ist das Sonderzeichen \b - welches das Drücken der <a href="http://www.waskilampi.com/img_pgs/backspace.jpg" target="_blank">Backspace</a> Taste simuliert. Ähnliche Vertreter sind \t für Tab und \n für Zeilenumbruch.</p>
<p>Solange ihr noch keinen Zeilenumbruch abgesetzt habt könnt ihr jede Ausgabe in der aktuellen Zeile widerrufen durch das ausgeben von \b dabei müsst ihr jedes Zeichen einzeln widerrufen. Wenn wir nun also unser Spinner-beispiel betrachten kann man das sehr einfach in .NET umsetzen:</p>
<pre>
<pre class="brush: csharp; ">

        static void Main(string[] args) {
            string[] states = { &quot;\\&quot;, &quot;|&quot;, &quot;/&quot;, &quot;-&quot; };
            int cur_state = 0;

            while (true) {
                Thread.Sleep(100);

                Console.Write(&quot;\b&quot;);
                Console.Write(states[cur_state]);
                cur_state++;
                if (cur_state == 4) {
                    cur_state = 0;
                }
            }
        }
</pre>
</pre>
<p>Genauso einfach geht das Ganze dann auch in Java:</p>
<pre>
<pre class="brush: java; ">

        public static void Main(string[] args) {

            string[] states = { &quot;\\&quot;, &quot;|&quot;, &quot;/&quot;, &quot;-&quot; };
            int cur_state = 0;

            while (true) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {}

                System.out.print(&quot;\b&quot;);
                System.out.print(states[cur_state]);
                cur_state++;
                if (cur_state == 4) {
                    cur_state = 0;
                }
            }
        }
</pre>
</pre>
<p>Ist in jedem Fall ein nettes Gimmick <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Beachten sollte man noch, dass man hier print() bzw. Write() benutzen muss und nicht println() oder WriteLine() da hier sonst automatisch ein \n mit an das Ende der Zeile gepackt wird!</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1992&amp;md5=8d2d34c7c1e3b731962074ff9898d523" 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/aktuelle-zeile-bei-kommandozeilen-applikationen-aktualisieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC: HTML5 Elemente mit jQuery Fallback nutzen</title>
		<link>http://blog.bigbasti.com/asp-net-mvc-html5-elemente-mit-jquery-fallback-nutzen/</link>
		<comments>http://blog.bigbasti.com/asp-net-mvc-html5-elemente-mit-jquery-fallback-nutzen/#comments</comments>
		<pubDate>Wed, 25 Jan 2012 09:47:45 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Workaround]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1955</guid>
		<description><![CDATA[Soo, nachdem ich die Überschrift mit all den hippen Begriffen vollgepackt habe die es in Sachen Web momentan so gibt möchte ich euch kurz erklären worum es in diesem Artikel gehen soll.

Ihr werdet sicher mitbekommen haben, dass HTML5 auf dem Vormarsch ist und auch wenn es immer noch nicht offiziell fertig ist findet man ...]]></description>
			<content:encoded><![CDATA[<p>Soo, nachdem ich die Überschrift mit all den hippen Begriffen vollgepackt habe die es in Sachen Web momentan so gibt möchte ich euch kurz erklären worum es in diesem Artikel gehen soll.</p>
<p>Ihr werdet sicher mitbekommen haben, dass HTML5 auf dem Vormarsch ist und auch wenn es immer noch nicht offiziell fertig ist findet man immer häufiger den HTML5-Header &lt;!DOCTYPE html&gt; auf diversen Seiten.</p>
<p>Eins der meiner Meinung nach nützlichsten Features die wir mit HTML5 erhalten sind die <a href="http://www.w3schools.com/html5/html5_form_input_types.asp" target="_blank">neuen Input-Typen</a>. Denn bisher hatten wir keine Wahl und mussten type="text" benutzen!</p>
<p>Die Eingabefelder vom Typ Text konnten natürlich alles enthalten, sind aber nicht gerade Benutzerfreundlich wenn man etwas komplexere Daten eingeben soll wie zum Beispiel ein Datum.</p>
<p>In HTML5 wurden deswegen spezifische Typen für solche immer wieder einkehrende Eingaben eingeführt. Eine von ihnen ist &amp;quot;Date&amp;quot;:</p>
<pre>
<pre class="brush: html; ">

Birthday: &lt;input type=&quot;date&quot; name=&quot;bday&quot; /&gt;
</pre>
</pre>
<p>Der große Vorteil hier ist, dass die Browser nun eine eigene Implementierung für diesen Typ von Eingabefeldern machen können. Falls der Browser nun also diesen neuen Eingabe Typ unterstützt blendet er automatisch einem (mehr oder weniger) schönen Date-Picker ein in dem man bequem das Datum wählen kann:</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://server.bigbasti.com/uploads/uploads/251212842982966.png "><img title="Browsersupport" src="http://server.bigbasti.com/uploads/uploads/251212842982966.png " alt="" width="500" height="300" /></a><p class="wp-caption-text">Ansicht des neuen Typen in verschiedenen Browsern</p></div>
<p>Ein weiterer großer Vorteil ist, dass auch die mobilen Browser wie z.B. auf dem iPhone diese neuen Elemente ebenfalls unterstützen und einen passenden Picker einblenden:</p>
<div class="wp-caption alignleft" style="width: 148px"><a href="http://server.bigbasti.com/uploads/uploads/2512128448977966.png "><img class="   " title="Date-Picker auf dem iPhone" src="http://server.bigbasti.com/uploads/uploads/2512128448977966.png " alt="" width="138" height="208" /></a><p class="wp-caption-text">Date-Picker auf dem iPhone</p></div>
<p>Wie ihr in dem ersten Screenshot sehen könnt unterstützt der FireFox (zumindest zum Zeitpunkt des Screenshots) den neuen Typ nicht. In diesem Fall blendet er ein gewöhnliches Textfeld ein wo wir nun gezwungen sind das Datum auf die gewohnte (unbequeme) Weise einzutragen.</p>
<p>Übrigens, ich glaube ich muss euch nicht sagen warum der Internet Explorer hier nicht mit aufgeführt ist oder? <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Und genau das ist das Problem um das es in diesem Blogpost geht. Wenn wir die tollen neuen Elemente nutzen gehen wir das Risiko ein, dass Nutzer die einen älteren Browser nutzen nicht in den Genuss einer bequemen Eingabe kommen.</p>
<div class="wp-caption alignright" style="width: 245px"><a href="http://jqueryui.com/demos/datepicker/"><img title="jQuery Date-Picker" src="http://server.bigbasti.com/uploads/uploads/251212852193838138.png " alt="" width="235" height="196" /></a><p class="wp-caption-text">jQuery Date-Picker</p></div>
<p>Wir könnten auch komplett auf das HTML5 Element verzichten und direkt alles mit jQuery machen, welches auch einen Date-Picker bietet, aber das ist auch nicht das gelbe vom Ei, denn dann wären die Mobilen Nutzer in Nachteil, da dort die Browser diese Elemente für gewöhnlich unterstützen und eine gewohnte Oberfläche für die Eingabe bieten.</p>
<p>Die Optimale Lösung ist offensichtlich eine Mischung beider Welten. Wenn der Benutzer die Seite mit einem kompatiblen Browser aufruft soll der Date-Picker des Browsers genutzt werden, wenn der Browser aber veraltet ist soll stattdessen der jQuery Fallback greifen und der JavaScript Date-Picker (siehe links) genutzt werden.</p>
<p>Zu unserem Glück macht uns ASP.NET MVC die Umsetzung dieses Plans sehr leicht, da es an den nötigen Stellen sehr einfach erweitert werden kann.</p>
<p>Schauen wir uns mal ein kleines Beispiel an. Wir haben eine Klasse Person, und wollen auch dessen Geburtstag speichern, hier wollen wir die tolle neue Funktionalität nutzen. Implementieren wir das Ganze jedoch erstmal wie gewohnt:</p>
<pre>
<pre class="brush: csharp; ">

    public class Person
    {
        public int ID { get; set; }
        public String Name { get; set; }
        public DateTime Geburtstag { get; set; }
    }
</pre>
</pre>
<p>Wenn wir die Model-Klasse haben können wir das MVC Scaffolding nutzen um für uns eine View zum Erstellen neuer Personen anzulegen:</p>
<div class="wp-caption aligncenter" style="width: 521px"><a href="http://server.bigbasti.com/uploads/uploads/25121296125932661.png "><img class=" " title="MVC Scaffolding kommt uns zu Hilfe" src="http://server.bigbasti.com/uploads/uploads/25121296125932661.png " alt="" width="511" height="504" /></a><p class="wp-caption-text">MVC Scaffolding kommt uns zu Hilfe</p></div>
<p>Schauen wir uns nun doch mal an was da für uns tolles generiert wurde:</p>
<pre>
<pre class="brush: html; ">

    &lt;div class=&quot;editor-field&quot;&gt;
        @Html.EditorFor(model =&gt; model.Geburtstag)
        @Html.ValidationMessageFor(model =&gt; model.Geburtstag)
    &lt;/div&gt;
</pre>
</pre>
<p>Auffällig hierbei ist, dass hier @Html.EditorFor genutzt wird und nicht etwa @Html.TextBoxFor! Der Hintergrund ist der, dass MVC bei der Generierung versuchen wird ein passendes Element für den angegebenen Datentyp (DateTime) zu bestimmen, aber da MVC standardmäßig nur den Typ Text kennt wird hier eigentlich immer ein Input-Element vom Typ text generiert.</p>
<p>Hier kommt uns die Erweiterbarkeit von MVC zu gute, denn wir können ganz einfach NuGet nutzen um uns die nötige Funktionalität zu verschaffen. Wir installieren das Packet MvcHtml5Templates.</p>
<div class="wp-caption aligncenter" style="width: 438px"><a href="http://server.bigbasti.com/uploads/uploads/251212929533298753.png "><img title="Installation über NuGet" src="http://server.bigbasti.com/uploads/uploads/251212929533298753.png " alt="" width="428" height="46" /></a><p class="wp-caption-text">Installation über NuGet</p></div>
<div class="wp-caption alignleft" style="width: 220px"><a href="http://server.bigbasti.com/uploads/uploads/25121293434438753.png "><img title="Neue Templates" src="http://server.bigbasti.com/uploads/uploads/25121293434438753.png " alt="" width="210" height="251" /></a><p class="wp-caption-text">Neue Templates</p></div>
<p>Nachdem NuGet alles erledigt hat werdet ihr feststellen, dass ihr ein paar neue Dateien in eurem Views/Shared Verzeichnis habt (siehe Bild links). Und wie ihr schon an dem Namen erkennen könnt sind das die neuen Input-Typen aus HTML5.</p>
<p>Diese Templates machen im Grunde nichts anderes als die MVC-Eigenen zu überschreiben und versehen die mit dem passendem Type-Attribut.</p>
<p>Hier sind euch keine Grenzen gesetzt ihr könnt natürlich auch eire eigenen Templates definieren mit euren eigenen Typen. (Auch wenn man das eher selten benötigt)</p>
<p>Das Tolle: mehr müssen wir nicht machen. MVC wird nun zur Laufzeit statt einem Text ein Date Input-Element für uns anlegen. Beachtet, dass das nur geht wenn wir in der View die allgemeine Funktion @Html.EditorFor nutzen und keinen Spezifischen Typ angeben.</p>
<p>Schauen wir mal in den Sourcecode der zur Laufzeit für das Geburtstagsfeld generiert wird:</p>
<pre>
<pre class="brush: html; ">

&lt;input class=&quot;text-box single-line&quot;
data-val=&quot;true&quot;
data-val-required=&quot;Das Feld &#039;Geburtstag&#039; ist erforderlich&quot;
id=&quot;Geburtstag&quot;
name=&quot;Geburtstag&quot;
type=&quot;datetime&quot;
value=&quot;&quot;; /&gt;
</pre>
</pre>
<p>Wie ihr seht wird nun der Korrekte Typ, nämlich datetime verwendet. Wenn wir die Seite nun also mit einem kompatiblen Browser aufrufen können wir ganz bequem das Datum wählen.</p>
<p>Leider ist der Opera Browser momentan wohl der einzige Desktop Browser der uns hier einen Benutzerfreundlichen Dialog einblendet (siehe erstes Bild oben), somit müssen wir dafür sorgen, dass die Benutzer mit anderen oder alten Browsern nicht benachteiligt werden.</p>
<div class="wp-caption alignleft" style="width: 248px"><a href="http://server.bigbasti.com/uploads/uploads/251212124663987.png "><img title="JavaScript Magie" src="http://server.bigbasti.com/uploads/uploads/251212124663987.png " alt="" width="238" height="272" /></a><p class="wp-caption-text">JavaScript Magie</p></div>
<p>Auch für diese Problematik bringt MVC bereits alles mit was nötig ist sie zu lösen. Werfen wir doch mal einen Blick in unseren Scripts Ordner finden wir alle nötigen jQuery und jQuery UI Skripte, dazu kommt noch die modernizr Bibliothek die uns auch zu Gute kommen wird.</p>
<p>Die jQuery Bibliotheken liefern und die nötige Funktionalität die wir benötigen um diesen hübschen Date-Picker einzublenden.</p>
<p>Die modernizr Bibliothek dagegen hilft uns herauszufinden ob der Browser, den der Benutzer momentan verwendet die gewünschten HTML5 Features unterstützt.</p>
<p>Nun müssen wir also bei unseren Formularen prüfen, ob der Browser die nötigen Funktionen kennt und bei Bedarf die jQuery Klassen einbinden. Das Ganze ist dank der Einfachheit von Modernizr und jQuery ziemlich simpel.</p>
<p>Wechseln wir zu unserer View und fügen die Referenzen auf die nötigen Skripte und CSS Dateien ein:</p>
<pre>
<pre class="brush: html; ">

&lt;script src=&quot;@Url.Content(&quot;~/Scripts/jquery-1.5.1.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;@Url.Content(&quot;~/Scripts/jquery-ui-1.8.11.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;@Url.Content(&quot;~/Scripts/modernizr-1.7.js&quot;)&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;link href=&quot;@Url.Content(&quot;~/Content/themes/base/jquery.ui.all.css&quot;)&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
</pre>
</pre>
<p>Unten in der View fügen wir nun eine Modernizr Abfrage ein und prüfen, ob der Browser das DateTime-Feld unterstützt, und wenn nicht lassen wir jQuery das Ganze für uns regeln:</p>
<pre>
<pre class="brush: html; ">

&lt;script type=&quot;text/javascript&quot;&gt;
    $(function () {
        if (!Modernizr.inputtypes.date) {
            $(&quot;input[type=&#039;datetime&#039;]&quot;).datepicker();
        }
    });
&lt;/script&gt;
</pre>
</pre>
<p>Mit dem Befehl $("input[type='datetime']").datepicker(); werden alle Input-Felder vom Typ DateTime durch den jQuery Picker ersetzt. Coole Sache!</p>
<div class="wp-caption alignleft" style="width: 293px"><a href="http://server.bigbasti.com/uploads/uploads/2512121394635647.png "><img src="http://server.bigbasti.com/uploads/uploads/2512121394635647.png " alt="Unser Browser kennt den Typ nicht :(" width="283" height="262" /></a><p class="wp-caption-text">Unser Browser kennt den Typ nicht <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p></div>
<p>Kleiner Hinweis am Rande: Das ist nicht wirklich best practice da die Skripte auch geladen werden wenn sie gar nicht benötigt werden (der Browser kennt das HTML5 Feld) ich habe das hier der Einfachheit geopfert.</p>
<p>Und das wars auch schon! Alle Browser die das Feld unterstützen blenden nun ihren Picker ein, ansonsten wird der jQuery Fallback genutzt.</p>
<p>Wir müssen uns auch nicht mit irgendwelchen UserAgent-Prüfungen herumschlagen und lassen das alles Modernizr erledigen, der das intern über JavaScript prüft und somit immer aktuell ist. Das heißt dass wenn irgendwann der IE plötzlich die neuen Typen kennt werden diese auch funktionieren!</p>
<p>Genauso könnt ihr auch bei all den anderen neuen HTML5 Typen vorgehen und euren Usern ein bestmögliches Bedienerlebnis bereiten <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><a href="http://dotnet-kicks.de/kick/?url=http%3a%2f%2fblog.bigbasti.com%2fasp-net-mvc-html5-elemente-mit-jquery-fallback-nutzen%2f"><img src="http://dotnet-kicks.de/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.bigbasti.com%2fasp-net-mvc-html5-elemente-mit-jquery-fallback-nutzen%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=1955&amp;md5=6f4995620c5babc5f3ed2b2f69c89eaa" 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-html5-elemente-mit-jquery-fallback-nutzen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Konsolenausgaben in einer WindowsForms Applikation</title>
		<link>http://blog.bigbasti.com/konsolenausgaben-in-einer-windowsforms-applikation/</link>
		<comments>http://blog.bigbasti.com/konsolenausgaben-in-einer-windowsforms-applikation/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 12:14:03 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Gut zu Wissen]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB.NET]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1948</guid>
		<description><![CDATA[Manchmal will man eine WindowsForms Anwendung auch über die Konsole aufrufen und dann möchte man natürlich auch Ausgaben der Anwendung in dem Konsolenfesnter sehen. Doch leider ist das nicht so einfach, da alle Aufrufe über die Console-Klasse werden ignoriert.

Doch warum ist das so? Das ist ganz einfach und liegt daran, dass das Konsolenfenster, das ...]]></description>
			<content:encoded><![CDATA[<p>Manchmal will man eine WindowsForms Anwendung auch über die Konsole aufrufen und dann möchte man natürlich auch Ausgaben der Anwendung in dem Konsolenfesnter sehen. Doch leider ist das nicht so einfach, da alle Aufrufe über die Console-Klasse werden <em>ignoriert</em>.</p>
<p>Doch warum ist das so? Das ist ganz einfach und liegt daran, dass das Konsolenfenster, das unser Programm startet zu einem anderem Prozess gehört, nämlich cmd.exe und somit nicht verbunden ist.</p>
<p>Was wir also tun müssen ist, unsere Ausgabe an das Konsolenfenster zu <em>heften,</em> das unsere Anwendung gestartet hat. Dafür kann man die Win32-Methode <a href="http://msdn2.microsoft.com/en-us/library/ms681952.aspx" target="_blank">AttachConsole</a> nutzen.</p>
<p>Diese ist sehr einfach aufgebaut und sollte vor der ersten Ausgabe an die Konsole aufgerufen werden:</p>
<p>Definition des Win32-Aufrufs: (Beispiele in VB.NET)</p>
<pre>
<pre class="brush: csharp; ">

    &lt;DllImport(&quot;kernel32.dll&quot;)&gt; _
    Private Shared Function AttachConsole(dwProcessId As Integer) As Boolean
    End Function
</pre>
</pre>
<p>Um die Ausgabe an den Prozess zu geben der uns aufgerufen hat (Parent-Process) kann man hier als Wert -1 übergeben:</p>
<pre>
<pre class="brush: csharp; ">

    Private Const ATTACH_PARENT_PROCESS As Integer = -1
</pre>
</pre>
<p>Was nun noch bleibt ist es die Methode aufzurufen, zum Beispiel in der Main-Methode der Applikation:</p>
<pre>
<pre class="brush: csharp; ">

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AttachConsole(ATTACH_PARENT_PROCESS)
        //[...]
</pre>
</pre>
<p>Das wars auch schon, nun werden eure Ausgaben an das Konsolenfester umgeleitet. Um die Konsole wieder von eurem Prozess zu lösen kann die paremeterlose Methode <a title="MSDN" href="http://msdn.microsoft.com/en-us/library/ms683150.aspx" target="_blank">FreeConsole</a> genutzt werden.</p>
<p>Es lohnt sich hier natürlich dann auch eine Unterscheidung zu machen wie die App gestartet wurde, also ob über Konsole oder über Doppelklick wie immer. Wenn sie über die Konsole gestartet wird, sollte man vielleicht die Oberfläche nicht mehr anzeigen. Das kann man dann zB. daran erkennen, dass Environment.GetCommandLineArgs.Length &gt; 1 ist.</p>
<p><strong>Probleme</strong></p>
<p>Leider gibts ein paar Nebeneffekte die nicht unbeachtlich sind.</p>
<p>Ein Problem ist, dass Konsolenfuntionen die die Ausgabe von Programmen umleiten zB. so: "myapp.exe -test &gt;test.txt" nicht funktionieren, die Ausgabe erfolgt weiterhin auf der Konsole. Hierfür konnte ich leider keine Lösung finden, wenn euch was einfällt einfach kommentieren.</p>
<p>Das zweite ist nur eine Schönheitssache, nämlich wenn das Programm beendet wird wird erst nicht die gewohnte Konsoleneingabezeile angezeigt, sondern nur der blinkende Cursor, so dass es aussieht als ob das Programm noch laufen würde, was es aber nicht mehr tut. (Wie gesagt Schönheitssache) Das kann man zB. dadurch umgehen, dass man vor dem Beenden des Programms noch ein [Enter] auf der Konsole ausgibt.</p>
<p>Weitere Infos und auch eine kleine Diskussion gibts <a href="http://www.csharp411.com/console-output-from-winforms-application/" target="_blank">hier</a> und <a href="http://benincampus.blogspot.com/2011/03/re-console-output-from-winforms.html" target="_blank">hier</a>.</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1948&amp;md5=654870545eed283ba93898fbcfb9fb64" 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/konsolenausgaben-in-einer-windowsforms-applikation/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC: Zugriff auf Dateien einschraenken</title>
		<link>http://blog.bigbasti.com/asp-net-mvc-zugriff-auf-dateien-einschraenken/</link>
		<comments>http://blog.bigbasti.com/asp-net-mvc-zugriff-auf-dateien-einschraenken/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 18:45:08 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1935</guid>
		<description><![CDATA[Oft kommt es vor dass man bestimmte Inhalte nicht der breiten Öffentlichkeit präsentieren möchte. So will man beispielsweise bestimmte Inhalte nur autorisierten Benutzern oder nur Admins zur Verfügung stellen, andere User die nicht eingeloggt sind sollen diese Inhalte nicht abrufen können. Ein weiterer Anwendungsfall wäre auch hotlinking zu verhindern.

Dieses Verhalten kann man in ASP.NET ...]]></description>
			<content:encoded><![CDATA[<p>Oft kommt es vor dass man bestimmte Inhalte nicht der breiten Öffentlichkeit präsentieren möchte. So will man beispielsweise bestimmte Inhalte nur autorisierten Benutzern oder nur Admins zur Verfügung stellen, andere User die nicht eingeloggt sind sollen diese Inhalte nicht abrufen können. Ein weiterer Anwendungsfall wäre auch <a href="http://de.wikipedia.org/wiki/Hotlinking" target="_blank">hotlinking</a> zu verhindern.</p>
<p>Dieses Verhalten kann man in ASP.NET MVC über verschiedene Wege erreichen. Eine beliebte Möglichkeit ist es</p>
<p><strong>die Dateien über einen Controller zu verteilen.</strong></p>
<p>Hierbei erstellt man einen Controller der eine Action hat in der die gewünschte Datei geladen und an den Browser zurückgegeben wird. Hier hat man dann die Bequemlichkeit, dass man problemlos prüfen kann ob der User eingeloggt ist und über die nötigen Rechte für das Bild verfügt. Das geht zum Beispiel mit dem Authorized-Attribut für die Actions.</p>
<p>Implementiert würde so eine Action dann wohl ca so aussehen:</p>
<pre>
<pre class="brush: csharp; ">

public ActionResult Image(string id)
{
    var dir = Server.MapPath(&quot;/Private/Images&quot;);
    var path = Path.Combine(dir, id + &quot;.jpg&quot;);
    return base.File(path, &quot;image/jpeg&quot;);
}
</pre>
</pre>
<p>Das Bild kann man dann so abrufen:</p>
<pre>
<pre class="brush: html; ">

&lt;img src=&quot;@Html.Content(&quot;~/Content/Image/&quot; + model.pictureID)&quot; /&gt;
</pre>
</pre>
<p>Dieser Ansatz funktioniert problemlos hat aber den kleinen Nachteil, dass er nicht so performant ist wie der direkte Zugriff auf die Ressource.</p>
<p>Eine weitere (und auch meine bevorzugte) Möglichkeit eine solche Zugriffskontrolle zu implementieren ist es durch</p>
<p><strong>einen eigenen RouteHandler.</strong></p>
<p>Eine Beispielimplementierung wie man auf diese Weise Hotlinking verhindern kann habe ich in <a href="http://www.mikesdotnetting.com/Article/126/ASP.NET-MVC-Prevent-Image-Leeching-with-a-Custom-RouteHandler" target="_blank">Mike Brinds Blog</a> gefunden.</p>
<p>Hier sind im Grunde drei kleine Schritte nötig um einen eigenen RouteHandler zum Laufen zu bekommen. (Code von Mikes Blog)</p>
<p>Zunächst müssen wir die RouteHandler Klasse anlegen, die das IRouteHandler Interface und dessen einzige Methode GetHttpHandler implementiert:</p>
<pre>
<pre class="brush: csharp; ">

public class ImageRouteHandler : IRouteHandler
{
  public IHttpHandler GetHttpHandler(RequestContext requestContext)
  {
    return new ImageHandler(requestContext);
  }
}
</pre>
</pre>
<p>Als nächstes erstellen wir die oben genutzte ImageHandler Klasse in der wir das das IHttpHandler Interface implementieren:</p>
<pre>
<pre class="brush: csharp; ">

public class ImageHandler : IHttpHandler
{
  public ImageHandler(RequestContext context)
  {
    ProcessRequest(context);
  }

  private static void ProcessRequest(RequestContext requestContext)
  {
    var response = requestContext.HttpContext.Response;
    var request = requestContext.HttpContext.Request;
    var server = requestContext.HttpContext.Server;

    var validRequestFile = requestContext.RouteData.Values[&quot;filename&quot;].ToString();
    const string invalidRequestFile = &quot;thief.gif&quot;;
    var path = server.MapPath(&quot;~/graphics/&quot;);

    response.Clear();
    response.ContentType = GetContentType(request.Url.ToString());

    if (request.ServerVariables[&quot;HTTP_REFERER&quot;] != null &amp;&amp;
        request.ServerVariables[&quot;HTTP_REFERER&quot;].Contains(&quot;yourdomain.com&quot;))
    {
      response.TransmitFile(path + validRequestFile);
    }
    else
    {
      response.TransmitFile(path + invalidRequestFile);
    }
    response.End();
  }

  private static string GetContentType(string url)
  {
    switch (Path.GetExtension(url))
    {
      case &quot;.gif&quot;:
        return &quot;Image/gif&quot;;
      case &quot;.jpg&quot;:
        return &quot;Image/jpeg&quot;;
      case &quot;.png&quot;:
        return &quot;Image/png&quot;;
      default:
        break;
    }
    return null;
  }

  public bool IsReusable
  {
    get { return false; }
  }
}
</pre>
</pre>
<p>Zu Schluss müssen wir diesen neuen Handler mit einer Route in der Global.asax registrieren:</p>
<pre>
<pre class="brush: csharp; ">

routes.Add(&quot;ImagesRoute&quot;,
                 new Route(&quot;images/{filename}&quot;, new ImageRouteHandler()));
</pre>
</pre>
<p>Hierbei ist noch wichtig, dass ihr die Route an der passenden Stelle registriert, sodass diese nicht ungewollt von einer anderen Route blockiert wird weil diese auch auf dieses Pattern matcht.</p>
<p>Nun werden alle Requests die auf die Route "images/{filename}" gehen und von einer anderen Domain stammen als eurer eigenen auf eine andere Grafik umgeleitet.</p>
<p>Nun bleibt noch ein kleines Problem, denn wenn das Verzeichnis mit den Bildern in eurem Content Verzeichnis liegt kann immer noch darauf verlinkt werden wenn man den vollen Pfad nimmt, also statt dem virtuellem Pfad</p>
<pre>
<pre class="brush: html; ">
http://localhost/images/myimg.jpg
</pre>
</pre>
<p>die URL benutzt unter der tatsächlich alle Bilder liegen:</p>
<pre>
<pre class="brush: html; ">
http://localhost/Content/graphics/myimg.jpg
</pre>
</pre>
<p>Dies liegt daran, dass der neue RouteHandler in diesem Fall nicht greift und die Default Route genutzt wird. Am einfachsten kann man dies verhindern wenn man den Zugriff für Unbefugte über die web.config sperrt:</p>
<pre>
<pre class="brush: xml; ">

  &lt;location path=&quot;Content/graphics&quot;&gt;
    &lt;system.web&gt;
      &lt;authorization&gt;
        &lt;allow roles=&quot;admin&quot; /&gt;
        &lt;deny users=&quot;*&quot; /&gt;
      &lt;/authorization&gt;
    &lt;/system.web&gt;
  &lt;/location&gt;
</pre>
</pre>
<p>Das war dann auch schon, ich nutze gern den zweiten Weg, da dieser mir einfacher und sauberer erscheint. Wenn euch noch andere Möglichkeiten einfallen wie man das anstellen kann dann immer her damit!</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1935&amp;md5=4370312dd926703596c6baf8858b1f24" 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-zugriff-auf-dateien-einschraenken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eine TreeView durchsuchen und den gefundenen Pfad aufklappen</title>
		<link>http://blog.bigbasti.com/eine-treeview-durchsuchen-und-den-gefundenen-pfad-aufklappen/</link>
		<comments>http://blog.bigbasti.com/eine-treeview-durchsuchen-und-den-gefundenen-pfad-aufklappen/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 14:16:21 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[VB.NET]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1860</guid>
		<description><![CDATA[Da ich heute wieder eine Mail mit der Frage bekommen habe wie man ein Item in einer TreeView finden kann und dieses dann anzeigen kann, dachte ich ich poste es gleich hier falls es noch jemand braucht.

Das Ganze funktioniert sehr einfach mit nur einer kleinen rekursiven Funktion:

   ''' 
    ...]]></description>
			<content:encoded><![CDATA[<p>Da ich heute wieder eine Mail mit der Frage bekommen habe wie man ein Item in einer TreeView finden kann und dieses dann anzeigen kann, dachte ich ich poste es gleich hier falls es noch jemand braucht.</p>
<p>Das Ganze funktioniert sehr einfach mit nur einer kleinen rekursiven Funktion:</p>
<pre>
<pre class="brush: vb; ">

   &#039;&#039;&#039; &lt;summary&gt;
    &#039;&#039;&#039; Diese Funktion durchläuft den ganzen Treenode bis ein Eintrag gefunden wird der dem Suchbegriff
    &#039;&#039;&#039; gleicht. Danach wird der Pfad der zu diesem TreeNode führt (zur Visualisierung) aufgeklappt
    &#039;&#039;&#039; &lt;/summary&gt;
    &#039;&#039;&#039; &lt;param name=&quot;tn&quot;&gt;Der zu durchsuchende Treenode
    &#039;&#039;&#039; &lt;param name=&quot;name&quot;&gt;Der Suchbegriff
    Public Sub findNode(ByVal tn As TreeNode, ByVal name As String)
        For Each tnn As TreeNode In tn.Nodes
            If tnn.Text = name Then
                Dim t As TreeNode = tnn
                For i As Integer = tnn.Level To i = 0 Step -1
                    Try
                        t = t.Parent
                        t.Expand()
                    Catch ex As Exception
                    End Try
                Next
                tnn.Parent.Expand()
                Exit Sub
            End If
            findNode(tnn, name)
        Next
    End Sub
</pre>
</pre>
<p>Hier laufen wir alle Nodes der TreeView durch bis wir auf einen Node stoßen der unserem Suchbegriff entspricht. Ab hier durchlaufen wir den ganzen Weg rückwärts und klappen alle übergeordneten Nodes auf, sodass wir unseren gesuchten Node zu Gesicht bekommen.</p>
<p>Diese Funktion kann man auch ganz gut als Extension Method umschreiben, sodass diese bequemer aufgerufen werden kann, aber das ist dann natürlich jedem selbst überlassen.</p>
<div class="wp-caption aligncenter" style="width: 545px"><a href="http://server.bigbasti.com/uploads/uploads/299211161135833355.png"><img title="Demoapp" src="http://server.bigbasti.com/uploads/uploads/299211161135833355.png" alt="Demoapp in Aktion" width="535" height="305" /></a><p class="wp-caption-text">Demoapp in Aktion</p></div>
<p>Hier noch ein Demoprojekt zum testen: <a href="http://server.bigbasti.com/uploads/uploads/TreeViewSearchDemoApp.zip" target="_blank">Download [VS 2010]</a></p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1860&amp;md5=12995d7d9dee6d0cea9e36a75d122071" 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/eine-treeview-durchsuchen-und-den-gefundenen-pfad-aufklappen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Nice2Know: Attribut-basierende Routen in ASP.NET MVC</title>
		<link>http://blog.bigbasti.com/nice2know-attribut-basierende-routen-in-asp-net-mvc/</link>
		<comments>http://blog.bigbasti.com/nice2know-attribut-basierende-routen-in-asp-net-mvc/#comments</comments>
		<pubDate>Sat, 17 Sep 2011 15:47:31 +0000</pubDate>
		<dc:creator>Sebastian Gross</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Tipps & Tricks]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blog.bigbasti.com/?p=1850</guid>
		<description><![CDATA[Für Routen ist in ASP.NET MVC für gewöhnlich die Global.asax zuständig, so werden hier alle Routen definiert und gemappt. Doch wenn man viele verschiedene Routen nutzen will wird es schnell voll in der eigentlich sehr übersichtlichen Klasse.

Da wäre es doch eigentlich cool wenn wir die Routen direct in unseren Controllern definieren könnten. Genau das ...]]></description>
			<content:encoded><![CDATA[<p>Für Routen ist in ASP.NET MVC für gewöhnlich die Global.asax zuständig, so werden hier alle Routen definiert und gemappt. Doch wenn man viele verschiedene Routen nutzen will wird es schnell voll in der eigentlich sehr übersichtlichen Klasse.</p>
<p>Da wäre es doch eigentlich cool wenn wir die Routen direct in unseren Controllern definieren könnten. Genau das können wir mit der Erweiterung <a href="https://github.com/mccalltd/AttributeRouting/wiki/_pages" target="_blank">AttributeRouting</a> machen.</p>
<div class="wp-caption aligncenter" style="width: 459px"><a href="http://server.bigbasti.com/uploads/uploads/179211172286.png "><img title="Installation" src="http://server.bigbasti.com/uploads/uploads/179211172286.png " alt="Installation" width="449" height="96" /></a><p class="wp-caption-text">Installation über NuGet</p></div>
<p style="text-align: left;">Dank NuGet ist die Installation in wenigen Sekunden abgeschlossen und wir können unsere Actions mit Routing-Attributen dekorieren.</p>
<p style="text-align: left;">Die Attribute sind hierbei sehr einfach gestaltet und bieten uns alles was wir benötigen.</p>
<pre>
<pre class="brush: csharp; ">

    public class DemoController : Controller
    {
        [GET(&quot;Ist/Das/Cool/Oder/Was&quot;)]
        public ActionResult Start()
        {
            return View();
        }
    }
</pre>
</pre>
<p>Nun muss man nur noch die Attribut-basierten Routen registrieren:</p>
<pre>
<pre class="brush: csharp; ">

    public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute(&quot;{resource}.axd/{*pathInfo}&quot;);

        routes.MapAttributeRoutes(); //--- das wars!

        routes.MapRoute(
            &quot;Default&quot;, // Route name
            &quot;{controller}/{action}/{id}&quot;, // URL with parameters
            new { controller = &quot;Home&quot;, action = &quot;Start&quot;,
                id = UrlParameter.Optional } // Parameter defaults
        );
    }
</pre>
</pre>
<p>Und fertig! Nun können wir die Seite starten und unsere Route testen:</p>
<div class="wp-caption aligncenter" style="width: 530px"><a href="http://server.bigbasti.com/uploads/uploads/1792111731231336.png "><img title="Das Ergebnis" src="http://server.bigbasti.com/uploads/uploads/1792111731231336.png " alt="Das Ergebnis" width="520" height="186" /></a><p class="wp-caption-text">Das Ergebnis</p></div>
<p>Die Routen die wir definieren können, beschränken sich nicht darauf, so können diese auch problemlos parametrisiert werden, inklusive Defaultparameter:</p>
<pre>
<pre class="brush: csharp; ">

    public class DemoController : Controller
    {
        [GET(&quot;Artikel/{artikelid}/{version?}&quot;)]
        [RouteDefault(&quot;artikelid&quot;, &quot;120&quot;)]
        public ActionResult Start(int artikelid, string version)
        {
            ViewBag.ArtikelId = artikelid;
            ViewBag.Version = version;

            return View();
        }
    }
</pre>
</pre>
<p>Hier wird der Parameter artikelid mit einem Defaultwert ausgestattet und der zweite optional gemacht. Das Ergebnis kann sich sehen lasen:</p>
<div class="wp-caption aligncenter" style="width: 463px"><a href="http://server.bigbasti.com/uploads/uploads/1792111742255336.png "><img title="Läuft!" src="http://server.bigbasti.com/uploads/uploads/1792111742255336.png " alt="Läuft!" width="453" height="558" /></a><p class="wp-caption-text">Läuft!</p></div>
<p>Hier hört das Framework nicht auf, so könnt ihr auch Regular Expressions in die Routen integrieren und auch mehrere Routen an eine Action heften. Die Möglichkeiten sind grenzenlos <img src='http://blog.bigbasti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Für weitere Infos schaut einfach auf der <a href="https://github.com/mccalltd/AttributeRouting/wiki/2.-Usage" target="_blank">Projekthomepage </a>vorbei, es lohnt sich!</p>
<p class="wp-flattr-button"></p> <p><a href="http://blog.bigbasti.com/?flattrss_redirect&amp;id=1850&amp;md5=e86fd31c11e06da4d9708006f221b747" 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/nice2know-attribut-basierende-routen-in-asp-net-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

