Artikel verschlagwortet mit ‘ASP.NET MVC’
Projektsetup ASP.NET MVC Webapplikation
Da ich ohnehin gerade dabei bin mein “Default” Projektsetup für das interne Entwicklerhandbuch zu dokumentieren, kann genauso gut auch ein Blogpost daraus werden. Gelebte Zweitverwertung.
1. Entwicklungsumgebung
- Visual Studio 2008 (optional aber dringend empfohlen ReSharper)
- Subversion (wir nutzen seit Kurzem unfuddle.com für SVN und Projektmanagementunterstützung)
- Virtual Box (VM für Testserver mit IIS und SQL Server Express)
2. Frameworks
- ASP.NET MVC + JQuery als Webframework
- Ninject für Dependency Injection
- NUnit und Moq für TDD
- log4net
3. Tools
- LinqPad zum testen von Linq Queries
- Notepad++ wenn es mal schnell gehen muss
- Paint.Net für schnelle grafische Anpassungen
- Expression Web zum Bauen von Templates und CSS
- Balsamiq für UI Mockups
4. Struktur der Visual Studio Solution
Jede Solution wird in mehrere Projektmappen aufgeteilt:
Domain: Enthält alle Domainobjekte sowie die Schnittstellendefinitionen der Repositories.
Infrastructure.Data: Enthält die jeweiligen Implementierungen der Repositories abhängig von der gewählten Datenzugriffsstrategie (NHibernate, Linq2SQL, EF, etc.)
Infrastructure.Messaging: Enthält Serviceimplementierungen für Mail Versand und andere Messaging Dienste
Presentation.Mvc: Enthält das ASP.NET MVC Webprojekt
Test: Enthält alle Unit Tests des Gesamtprojekts
ASP.NET MVC 2 Preview 2
Das Team um Phil Haack hat die 2. Preview der kommenden Version 2 des ASP.NET MVC Frameworks veröffentlicht. Die neue Version bringt einige Verbesserungen und Erweiterungen mit z.B.:
- Client Side Validation
- Model Validation Provider
- Areas
- Metadata Providers
Mehr Information in Phil Haack’s Blog
HowTo: Gravatar Helper für ASP.NET MVC
Gravatar ist ein öffentlicher und kostenloser Webdienst der die Verknüpfung eines Profilbildes oder auch Avatars mit einer Email-Adresse ermöglicht. Gravatar stellt somit einen Art globalen Avatar bereit.
Die Einbindung in eigene Seiten ist denkbar simpel.
To request a gravatar from our servers, you simply add an image to your users activity with an "src" attribute that points to our gravatar image generator and includes an MD5 hash of the user’s email address. Since all gravatars are rated with an MPAA style rating, you can restrict your site to show only gravatars whose content you are comfortable with. Quelle: http://en.gravatar.com
Für ASP.NET MVC basierte Projekte bietet es sich an, die Einbindung über einen eigenen HtmlHelper zu realisieren. Zunächst habe ich eine Klasse GravatarViewHelper in meinen MVC Projekt angelegt.
Als nächstes werden nun die eigentlichen Extension Methoden definiert.
public static string GravatarLink(this HtmlHelper html, string id,
string alternateText, string email,
int size, string rating) { return GravatarLink(html, id, alternateText, email, size, rating, null); } public static string GravatarLink(this HtmlHelper html, string id,
string alternateText, string email,
int size, string rating, object htmlAttributes) { if (String.IsNullOrEmpty(email)) return String.Empty; var url = BuildGravatarUrl(email, size, rating); var tag = BuildTag(id, url, htmlAttributes, alternateText); return tag; }
Ziel der Methoden ist es ein <img> Tag zu rendern, dessen “src” Attribut die generierte Gravatar URL enthält. Das Erstellen der Gravatar URL erfolgt in 3 Schritten:
1. Zusammenbauen der Basis URL
2. Erzeugen des MD5 Hash aus der Email Adresse
3. Hinzufügen von Gravatar Optionen (Bildgröße, Rating)
private static string BuildGravatarUrl(string email, int size, string rating) { var builder = new UriBuilder("http://www.gravatar.com/"); builder.Path = "avatar/"; builder.Path = builder.Path + CreateEmailMd5Hash(email); AppendQueryToGravatarUri(builder, "s="+size); AppendQueryToGravatarUri(builder, "r=" + rating); AppendQueryToGravatarUri(builder, "d=identicon"); return builder.ToString(); }
Abschließend muss noch das img Tag erzeugt werden.
private static string BuildTag(string id, string url,
object htmlAttributes,
string alternateText) { var builder = new TagBuilder("img"); builder.GenerateId(id); builder.MergeAttribute("src", url); builder.MergeAttribute("alt", alternateText); builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); return builder.ToString(TagRenderMode.SelfClosing); }
Nun noch schnell im View ein Import Statement für den neuen HtmlHelper hinzufügen und fertig.
%@Import Namespace="Chessman.Mvc.Helper"%
<% foreach (var user in Model) { %> <%= Html.GravatarLink("myGravatar", "Gravatar Image", user.Email, 80, "PG") %>
<%
}
%>
Hier nochmal der komplette Code der GravatarViewHelper Klasse:
public static class GravatarViewHelper { public static string GravatarLink(this HtmlHelper html, string id,
string alternateText, string email,
int size, string rating) { return GravatarLink(html, id, alternateText, email, size, rating, null); } public static string GravatarLink(this HtmlHelper html, string id,
string alternateText, string email,
int size, string rating, object htmlAttributes) { if (String.IsNullOrEmpty(email)) return String.Empty; var url = BuildGravatarUrl(email, size, rating); var tag = BuildTag(id, url, htmlAttributes, alternateText); return tag; } private static string BuildGravatarUrl(string email, int size, string rating) { var builder = new UriBuilder("http://www.gravatar.com/"); builder.Path = "avatar/"; builder.Path = builder.Path + CreateEmailMd5Hash(email); AppendQueryToGravatarUri(builder, "s="+size); AppendQueryToGravatarUri(builder, "r=" + rating); AppendQueryToGravatarUri(builder, "d=identicon"); return builder.ToString(); } private static void AppendQueryToGravatarUri(UriBuilder builder, string query) { if (builder.Query != null && builder.Query.Length > 1) builder.Query = builder.Query.Substring(1) + "&" + query; else builder.Query = query; } private static string CreateEmailMd5Hash(string email) { var provider = new MD5CryptoServiceProvider(); var bytesToHash = Encoding.UTF8.GetBytes(email); bytesToHash = provider.ComputeHash(bytesToHash); var result = String.Empty; foreach (var b in bytesToHash) { result = (result + b.ToString("x2")); } return result; } private static string BuildTag(string id, string url, object htmlAttributes,
string alternateText) { var builder = new TagBuilder("img"); builder.GenerateId(id); builder.MergeAttribute("src", url); builder.MergeAttribute("alt", alternateText); builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); return builder.ToString(TagRenderMode.SelfClosing); } }
ASP.NET MVC – RedirectToAction Firefox Ajax Problem
Manchmal ist es zum aus der Haut fahren. In meiner App wird eine Liste per Ajax geladen (Index Action). Jeder Eintrag der Liste stellt direkt eine Löschfunktion zur Verfügung. Zum Löschen wird die Delete Action per Ajax Post aufgerufen. Diese leitet nach getaner Arbeit mittels RedirectToAction an die Index Methode weiter. So weit, so gut.
Nun wird aber in der Index Action mit Request.IsAjaxRequest entschieden ob die ganze Seite oder nur die Liste als PartialView gerendert werden soll. Die Request.IsAjaxRequest Abfrage müsste in meinem Fall “true” zurückgeben. Tut sie auch, allerdings nur im Internet Explorer. Im Firefox klappt es ums Verrecken nicht. Irgendwie gehen benötigte Header Informationen verloren oder werden nicht richtig gesetzt.
Eine Möglichkeit zur Lösung oder besser Umgehung des Problems bietet sich mit TempData an. In der Delete Action wird eine Variable [IsActionRedirect] in TempData gesetzt und in der IndexAction abgefragt. (if (Request.IsAjaxRequest() || TempData["ActionRedirect"] != null)) Je nach Ergebnis wird dann der entsprechende View gerendert. Nicht schön aber es funktioniert.
Internet Explorer 8 und ASP.NET MVC Ajax
Ich mag den neuen IE 8 wirklich. Aber manchmal treibt mich das Ding in den Wahnsinn. Folgendes Szenario: Ich rufe mittels jQuery $.getJson eine Action in meinem Controller auf, die mir das gewünschte Json Objekt zurückgibt. Das Ergebnis wird dann an eine bestehende Liste auf der Seite angefügt. So weit so gut. Beim ersten Aufruf funktioniert auch alles wunderbar. Aber ab dem zweiten Aufruf scheint der IE den Aufruf zu cachen, denn er fügt zwar einen neuen Eintrag an allerdings hat dieser immer die gleichen Werte. Im Firefox funktioniert es einwandfrei. Benutzt man statt $.getJson die $.post Methode funktioniert es auch im IE. Abgesehen von der Tatsache das POST in meinem Fall kontextbezogen eh die bessere, weil logischere Methode war, wäre ich für eine Erklärung dankbar.
ASP.NET MVC 1.0 final verfügbar
Es ist vollbracht. Seit heute steht das ASP.NET MVC Framework in der finalen Version 1.0 zum Download bereit. Die besten Glückwünsche an das Entwicklerteam um Phil Haack für dieses großartige und moderne Framework.
Kostenloses ASP.NET MVC eBook Tutorial
Scott Guthrie hat gestern seinen Beitrag zum kommenden ASP.NET MVC Buch als kostenloses eBook zur Verfügung gestellt. Dieses bietet auf 185 Seiten ein komplettes end-to-end Tutorial zum Erstellen einer ASP.NET MVC Applikation. Das Tutorial bezieht sich auf die “NerdDinner” Applikation. Der SourceCode steht auf CodePlex zum Download bereit.
Hier die Links nochmal zusammen gefasst:
Download der Beispielapplikation von Codeplex
Vorbestellung des kompletten Buches von bei Amazon:
|
ISBN: 0470384611 |
ASP.NET MVC 1.0 RC2 verfügbar
Seit heute steht der Release Candidat 2 des ASP.NET MVC Frameworks zum Download bereit. Die wichtigsten Änderungen gegenüber dem RC1:
- Das Setup setzt zwingend das .NET Framework 3.5 SP1 voraus
- Neuer Server-only Installationsmodus
- Bin Deployment auf Hosts ohne SP1 ist weiterhin möglich
Mehr Infos in den Release Notes und in Phil Haack’s Post
ASP.NET MVC 1.0 RC verfügbar
Wie ScottGu in seinem Blog ankündigte, steht das neue Microsoft ASP.NET MVC Framework als “Release Candidate” zum Download bereit. Dieses enthält neben Bug fixes auch eine Reihe von Detailverbesserungen und neuen Features, die es nicht mehr in die Beta geschafft hatten. Die finale Version wird voraussichtlich nächsten Monat verfügbar sein.
Download
Details zum RC direkt in ScottGu’s Blog
Infos zum ASP.NET MVC Framework
Professional ASP.Net MVC 1.0: Rob Conery, Scott Hanselman, Phil Haack: Englische Bücher