BigBasti's Blog About Me & my Digital Lifestyle

19Aug/101

HowTo: Bilder als Links benutzen in ASP.NET MVC

In diesem Artikel geht es um eine eigentlich ganz simple Angelegenheit, nämlich Bilder-Links in ASP.NET MVC.  Um Links zu generieren wird hier eine HtmlHelper Klasse bereitgestellt, die die Links abhängig von der gewünschten Action und dem gewünschten Controller generiert, das ist eigentlich eine feine Sache, nur lassen sich damit leider keine Bilder-Links generieren.

Das Problem an der Sache ist, dass der HtmlHelper seine Ausgabe für HTML formatiert und somit einer Übergabe von "<img src="..." alt="..." />" als Linkname nicht verarbeitet werden würde, sondern direkt so ausgegeben.

Ich habe mich dann an Google gewendet und viele verschiedene Ansätze gefunden um das Problem zu lösen oder wenigstens zu umgehen. Hier gibt es allgemein gesagt zwei Lösungsansätze und man muss wohl selber entscheiden welches einem mehr Vorteile bietet und einem persönlich zusagt.

Ansatz 1: Den a-Tag und den img-Tag selber anlegen und die Route mit der UrlHelper-Klasse generieren. Hier ein paar Beispiele:


<a href="<%= Url.RouteUrl(">">
   put in <span>whatever</span> you want, also <img src="a.gif" alt="images" />.
</a>

<a href="<%= Url.Action(">">
   <img src="../../Content/Images/add_48.png" alt="" />
</a>

<%= Html.ActionLink("__IMAGE_PLACEHOLDER__", "Products")
.Replace("__IMAGE_PLACEHOLDER__", "<img src="\" alt="" />")%>

Alle diese Methoden funktionieren und erzeugen einen Link der ein Bild umschießt, doch in meinen Augen ist das eine nicht so schöne Methode, denn solche Links werden doch ziemlich oft generiert und da fände ich eine schöne Methode wie Html.ActionLinkWithImage schon angenehmer und lesbarer.

Ansatz 2: Eine Eigene Helper Methode erstellen die die Generierung für uns übernimmt:

Nach etwas mehr Suchen habe ich auch eine Extension Method in Stephen Walthers Blog gefunden. Diese sieht wie folgt aus (habe die Funktion noch um den Parameter Controller ergänzt):


public static string ImageLink(this HtmlHelper helper, string actionName,
    string controllerName, string imageUrl, string alternateText, object routeValues,
    object linkHtmlAttributes, object imageHtmlAttributes) {

    var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
    var url = urlHelper.Action(actionName, controllerName, routeValues);

    // Create link
    var linkTagBuilder = new TagBuilder("a");
    linkTagBuilder.MergeAttribute("href", url);
    linkTagBuilder.MergeAttributes(new RouteValueDictionary(linkHtmlAttributes));

    // Create image
    var imageTagBuilder = new TagBuilder("img");
    imageTagBuilder.MergeAttribute("src", urlHelper.Content(imageUrl));
    imageTagBuilder.MergeAttribute("alt", urlHelper.Encode(alternateText));
    imageTagBuilder.MergeAttributes(new RouteValueDictionary(imageHtmlAttributes));

    // Add image to link
    linkTagBuilder.InnerHtml = imageTagBuilder.ToString(TagRenderMode.SelfClosing);

    return linkTagBuilder.ToString();
}

//Benutzung:
<%= Html.ImageLink("Action", "Controller", "Pfad_zum_Bild", "alternativText", new { id = e.Id }, null, new { border = "0" })%>

Diese Funktion erledigt genau das was ich brauchte, sie generiert den benötigten Link und auch den IMG-Tag aus meinen übergebenen Informationen und sieht der Html.ActionLink() Methode dabei auch noch so ähnlich dass man gar nicht darauf kommt, dass es eine nachträglich eingefügte Extension ist ;-)

Falls ihr noch nach einer Möglichkeit nutzt das ganze auch mit streng typisierten Links zu nutzen solltet ihr in Mirkos Blog vorbeischauen, er hat auch dafür eine Extension Method gebastelt.

Ich bin mit dieser Lösung ganz zufrieden, doch interessiert es mich trotzdem, wie ihr das in euren Projekten handhabt und eure Links erstellt. Vielleicht habt ihr ja eine bessere Methode auf Lager.

VN:F [1.9.4_1102]
Rating: 0.0/10 (0 votes cast)
9Dez/090

ASP.NET: Erzeugen eines MD5 Hashs

Wer sich schon mal mit PHP auseinander gesetzt hat, wird wissen wie einfach es ist dort einen MD5 Hash zu einem Wert zu berechnen. Dies geht dort sehr simpel mit der Funktion "MD5($wert);".

Leider oder zum Glück ist es in in ASP.NET etwas komplexer aufgebaut. Somuss man hier erst Instanzen von Kryptographie Klassen erstellen, bevor man endlich den gewünschten MD5 String bekommt.

So sieht der Code dafür aus:


using System.Security.Cryptography;
using System.Text;
        public String MD5(String wert)
        {
            byte[] bWert = Encoding.UTF8.GetBytes(wert);
            MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] hash = md5.ComputeHash(bWert);
            string md5Wert = BitConverter.ToString(hash).Replace("-", "").ToLower();

            return md5Wert;
        }

Mit dieser Funktion bekommt man einen sauberen MD5 Hash in Kleinbuchstaben. Diese Funktion lässt sich nun so benutzen wie unter PHP um bequem MD5 hashes zu berechnen.

VN:F [1.9.4_1102]
Rating: 0.0/10 (0 votes cast)
18Nov/090

ASP.NET: Codeändeungen während des Debugvorgangs erlauben

aspnetHeute wurde ich auf ein Problem hingewiesen, dass entsteht, wenn man Webseiten mit ASP.NET in Kombination mit einem ASP.NET Entwicklungs Webservers entwickelt.

Wenn man nämlich während des Debug Vorgangs, wenn die Applikation im "Pause"-Modus ist den Quelltext verändern will bekommt man folgende Meldung vom Visual Studio zu sehen:

Änderungen sind nicht zulässig, wenn der Debugger an einem bereits Ausgeführten Prozess
angehängt wurde oder der debuggte Code zur Build- oder Laufzeit optimiert wurde.

Dies liegt daran, dass das Projekt nicht richtig bzw. garnicht konfiguriert wurde. Um diese Funktion benutzen zu können muss man in die Projekteigenschaften wechseln, dann auf der linken Seite den Tab "Web" wählen und die CheckBox "Bearbeiten und Fortfahren aktivieren".

Nun wird das Projekt wie gewohnt debuggt. Diese Einstellung ist leider gut versteckt und ich kann auch nicht nachvollziehen, warum diese Standardmäßig deaktiviert ist.

VN:F [1.9.4_1102]
Rating: 0.0/10 (0 votes cast)
   
Get Adobe Flash playerPlugin by wpburn.com wordpress themes