Zum Inhalt springen

Archiv

Archiv für November 2009

Da ich ja ursprünglich von PHP herkomme, habe ich natürlich eine schöne Funktion wie nl2br() vermisst.
Da ich nichts gescheites gefunden habe, habe ich natürlich die Funktionen von C#3.0 ausgenutzt und einfach die HtmlHelper Class erweitert.
Vielleicht kann es ja wer gebrauchen.

using System.Web.Mvc;

namespace MyProject.CustomExtensions
{
    public static class MyHtmlHelperExtensions
    {
        public static string Encode(this HtmlHelper html, string text, bool convertNewLine)
        {
            if (convertNewLine)
            {
                return html.Encode(text).Replace("\n", "<br />");
            }
            return html.Encode(text);
        }

        public static string Encode(this HtmlHelper html, object text, bool convertNewLine)
        {
            if (convertNewLine)
            {
                return html.Encode(text).Replace("\n", "<br />");
            }
            return html.Encode(text);
        }
    }

}

Früher habe ich, wie wahrscheinlich viele „Neueinsteiger“ in Sachen PC, viele Spielezeitschriften gelesen, ala PC Games, GameStar oder PC Action. Mittlerweile spiele ich kaum noch und daher sind die Zeitschriften nicht sonderlich interessant für mich. Nun hat Boris Schneider-Johne, seines Zeichens Senior Product Manager für die Xbox Plattform in Deutschland und ehmahliger Chefredakteur von PC-Player, einen interessanten Artikel zu den Bewertungssystemen solcher Spiele Zeitschriften geschrieben.

Solltet ihr mal lesen, an vielen Stellen kann ich Hrn. Schneider-Johne echt zustimmen und es bestätigt nur meine Meinung, dass die Testergebnisse fast nie(!!) mit meiner persönlichen Meinung übereinstimmten. Sicherlich habe ich mich von Testergebnissen beeinflussen lassen, vielleicht sind mir deswegen einige tolle Spiele durch die Lappen gegangen.

So heute muss ich mal zum TÜV, die Hauptuntersuchung ist fällig.
Die Abgasuntersuchung erst im Juni nächstes Jahr. Warum wieso weshalb, weiß ich nicht, ist halt so.

Nun habe ich gelesen, dass die nächstes Jahr die AU-Plakette abgeschafft werden soll, die Plakette gibs dann nur noch wenn die AU und die HU passt.
Wenn ich dann aber nächstes Jahr noch mal die große Untersuchung bezahlen muss, dann kann ich den Spaß auch heute komplett machen. Weiß da irgendwer bescheid?

Peter Bucher hat einen interessanten Artikel rund um IEnumerable und wie und wann man es richtig nutzt veröffentlicht.
Sollte man mal gelesen haben und natürlich auch anwenden. Ich werd es auf jeden Fall!

Wann IEnumerable nutzen, wann ICollection und wieso überhaupt IList?

Gibt in dem Blog übrigens noch andere lesenswerte Beiträge!

So langsam sammel ich meine Erfahrung mit ASP.NET MVC, gute sowie schlechte.
Da kommen wir mal zu meinem heutigen Problem. Ich habe ein Formular, welches ich per Ajax an den Server senden möchte, dieser überprüft die Daten und gibt bei Bedarf ein Zusammenfassung der Fehler aus, wobei das Formular ausgefüllt bleibt.

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyModel>" %>
<%= Html.ValidationSummary(); %>
<% using(Ajax.BeginForm("MyAction", new AjaxOptions { UpdateTargetId = "fromDiv" })) { %>
Benutzername: <%= Html.Textbox("username", Model.Username) %>
<input type="submit" value="Absenden" />
<% } %>

Hier mal als Beispiel. Das ganze wurde dann an den Server gesendet, validiert und bei Bedarf halt mit Fehlermeldung noch mal ausgegeben.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyAction(string username) {
   if(this.UsernameExists(username)) {
      this.ModelState.AddModelError("errorUsername","Benutzername existiert schon!");
      MyModel user = new MyModel { Username = username + "1" };
      return PartialView("MyControl", user);
   }
   //...
}

So, angenommen wir geben nun einen Benutzername ein, welcher schon existiert. Dann sollte nun das Formular erscheinen, oben die ValidationSummery und als Benutzername vorgeblendet der von eben + 1. Möge man meinen, ist aber nicht so. Es erscheint zwar die ValidationSummary aber nicht die 1 hinter dem Namen.
Ich hab das gute Teil rauf und runter debugt, in div. Browsern, bei allen das selbe Ergebnis. Im Model steht der richtige Wert, er wird aber nicht angezeigt.
Eine Erklärung konnte ich nicht finden, aber eine Lösung.

Das Problem liegt an Html.Textbox(). Es scheint, als ob er das Objekt im Cache vorhält. Da werden ganz böse Erinnerungen an ViewState wach. Lösen konnte ich das Problem, in dem ich die Textbox manuell erstelle:

Benutzername: <input type="text" name="username" value="<%= Html.Encode(Model.Username) %/>" />

Aber auf so etwas muss man erstmal kommen. Löst ja eigentlich nicht das Problem sondern nur umgangen. Vielleicht find ich ja noch mal einen Beitrag dazu in der MSDN oder jemand hinterlässt mir einen schönen Link in den Kommentaren.