Archive for January, 2009

“Validation of viewstate MAC failed” Problem in .NET 3.5 SP1

Thursday, January 29th, 2009

Falls ihr auch schon bei der Umstellung von .NET 2.0 auf .NET 3.5 (speziell nach der Installation von SP1) auf folgende Fehlermeldung gestoßen seid und bei google zu diesem Thema keine wirkliche Lösung gefunden habt:

“Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.”

Validation of viewstate MAC failed

ViewStateMAC Fehlermeldung

Es ist so, dass die Behebung der Fehlermeldung in vielen Fällen absolut nichts mit der Konfiguration zu tun hat. In den meisten Einträgen bei google habe Ich eigentlich nur hinweise gefunden, dass man den ViewStateMac abstellen soll, damit wieder alles funktioniert.

Also entweder in der Web.Config:

oder direkt in der Page Direktive

<!--bla....bla...** Inherits="MyAssembly.MyPage" enableViewStateMac="False"-->

Dabei ist es in vielen Fällen viel einfacher! Bei mir war in einer alten Website das Problem, dass im form tag der MasterPage eine action angegeben war. Bisher wurde das “action” Attribut komplett ignoriert…was nun aber bei .NET 3.5 SP1 nicht mehr der Fall ist!

Bei mir hat es dann ausgereicht aus:

<form id="form1" action="SomePage.aspx" enctype="application/x-www-form-urlencoded">
</form>

einfach das “action” Attribut zu entfernen:

<form id="form1" enctype="application/x-www-form-urlencoded"></form>

Und schon funktionierte wieder alles so wie es sollte!

Hintergrund dazu ist, daß es mit .NET 3.5 SP1 nun möglich ist eine eigene Seite zu definieren, an die das Formular gesendet werden soll. Bisher wurde das Attribut einfach ignoriert…egal was da angegeben war. Wenn ich mich nicht irre, war es bei mir vorher sogar leer.

Ich kann also nur empfehlen bei Applikationen, die vor .NET 3.5 und SP1 wunderbar funktioniert haben zuerst kurz mal nach dem action Attribut im form tag zu gucken, bevor ihr an den Configs dreht! ;-)

Empfohlene Bücher:
C# von Kopf bis Fuß
Entwurfsmuster von Kopf bis Fuß
Objektorientierte Analyse und Design von Kopf bis Fuß
Ajax von Kopf bis Fuß

Zugriff auf Properties einer MasterPage aus dem Code-Behind einer ContentPage

Tuesday, January 27th, 2009

So, hier ist er nun: Der erste reguläre Post!

Eigentlich wollte Ich ja mit ein wenig anspruchsvolleren Tutorials zum Thema LINQ, .NET 3.5 & Design Patterns anfangen. Allerdings sind es ja auch immer wieder die kleinen Dinge, die man schon gefühlte 100 mal bei google gesucht hat und sich einfach nie merken kann.

Ein Kandidat hierfür ist bei mir das “Wie kann Ich noch gleich auf eine Property einer MasterPage innerhalb der ContentPage zugreifen?”.

Für alle, die es nur zufälligerweise kurz vergessen haben:

<!--MasterType VirtualPath="~/MasterPage.master"-->

Für alle, die es in Zukunft vergessen können wollen:

Angenommen, wir haben eine MasterPage, auf der ein Label platziert ist, welches den Titel der Seite darstellen soll.

DefaultMaster.master

   <form id="form1" runat="server">
    <div>
        <asp:Label ID="Header" runat="server"></asp:Label>
        <asp:ContentPlaceHolder id="ContentPlaceHolder1" runat="server">
 
        </asp:ContentPlaceHolder>
    </div>
    </form>

Wir wollen nun diesen Titel über eine Property der MasterPage direkt im Code-Behind der ContentPage ansprechen. Hier wird nun noch eine Property angelegt mit der wir das Label füllen wollen:

DefaultMaster.master.cs

public partial class MasterPage : System.Web.UI.MasterPage
{
    public string HeaderText { get; set; }
 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (HeaderText != null) Header.Text = HeaderText;
    }
}

Hinweis: Hier wird die kurze Schreibweise von Properties ohne “backing-field” benutzt. D.h. es wird nicht explizit ein Field deklariert und der getter und setter implementiert. Diese Schreibweise gibt’s seit .NET 3.5! Natürlich kann die Property auch wie gehabt geschrieben werden!

    private string headerText;
 
    public string HeaderText
    {
        get { return headerText; }
        set { headerText = value; }
    }

Will man nun auf diese Property von einer ContentPage zugreifen, muss zuerst eine “Strongly Typed Reference” in der ContentPage zu der MasterPage erstellt werden.

Default.aspx

<!--Page Language="C#" MasterPageFile="~/MasterPage.master" ... -->
<!--MasterType VirtualPath="~/MasterPage.master"-->

Nun kann man im Code-Behind der ContentPage schön auf alle Properties der MasterPage über “Master” zugreifen:

Default.aspx.cs

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Master.HeaderText = "Hallo, Ich komme gerade von der ContentPage!";
    }
}

So, das war’s auch schon. Ich denke mal, dass die nächsten Posts sich mehr mit interessanteren Dingen beschäftigen werden. Ich werde trotzdem auch weiterhin solche Kleinigkeiten posten…kann ja nix schaden die typischen Sachen mal an einer Stelle finden zu können!

Empfohlene Bücher:
C# von Kopf bis Fuß
Entwurfsmuster von Kopf bis Fuß
Objektorientierte Analyse und Design von Kopf bis Fuß
Ajax von Kopf bis Fuß