Bei der Entwicklung mit Masterpage-Dateien sollte man eines nie, nie, nie machen:
Eine Masterpage-Datei, die im Dateisystem liegt (z.B. ans Bestandteil eines Features) mit dem SharePoint Designer editieren. Der Effekt ist grausam! Jede aspx-Datei, die diese Masterpage-Datei verwendet, wird eine Fehlermeldung "Datei nicht gefunden" verursachen. Und das, obwohl zunächst alle Dateien offensichtlich vorhanden sind.
Was passiert also beim Editieren mit dem SharePoint Designer?
Nun, er versucht einfach nur schlau zu sein. Wenn eine Datei aus dem Dateisystem geöffnet wird, dann untersucht der SharePoint Designer alle Pfad- und Dateiangaben, die in der Datei vorhanden sind. Und die Pfade, mit denen er nichts anfangen kann, die werden geändert !!! Der Effekt ist folgender:
In den meisten Masterpage-Dateien wird im Kopf der Datei folgendes Fragment zu finden sein:
<@Master language="C#"%>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="wssuc" TagName="Welcome" src="~/_controltemplates/Welcome.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="DesignModeConsole" src="~/_controltemplates/DesignModeConsole.ascx" %>
<HTML dir="<%$Resources:wss,multipages_direction_dir_value%>" runat="server" xmlns:o="urn:schemas-microsoft-com:office:office" __expr-val-dir="ltr">
<HEAD runat="server">
[...]
Hier sind besonders die Register-Einträge zu beachten, die die Tagnames "Welcome" und "DesignModeConsole" definieren. Hier werden relative Pfade angegeben ("~/controltemplates/…"). Befindet sich die Datei im Dateisystem und wird dann mit dem SharePoint Designer bearbeitet und gespeichert, dann sieht das Fragment anschließend so aus:
<@Master language="C#"%>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.ApplicationPages" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="wssuc" TagName="Welcome" src="_controltemplates/Welcome.ascx" %>
<%@ Register TagPrefix="wssuc" TagName="DesignModeConsole" src="_controltemplates/DesignModeConsole.ascx" %>
<HTML dir="<%$Resources:wss,multipages_direction_dir_value%>" runat="server" xmlns:o="urn:schemas-microsoft-com:office:office" __expr-val-dir="ltr">
<HEAD runat="server">
[...]
Wie unschwer erkennbar ist, "optimiert" der SharePoint Designer ein wenig und entfernt aus den Pfadangaben den Teil "~/". Damit ist die Datei bei der Ausführung der Masterpage nicht mehr auffindbar, was zum Fehler "Datei nicht gefunden" führt.
Daher, wenn eine Masterpage aus dem Dateisystem editiert werden soll, dann entweder den guten alten Notepad oder das Visual Studio verwenden.