Holen Sie sich die bereitgestellte ASPX-Seite im Feature-Receiver, um WebPart hinzuzufügen
-
10-12-2019 - |
Frage
Ich habe eine SharePoint-Lösung, die eine bereitstellt aspx
Seite in einem benutzerdefinierten Ordner in der Layouts
Ordner.Ich muss diese Seite in die Feature Event Receiver
also kann ich noch ein hinzufügen WebPart
.
Im FeatureActivated
Methode, wenn ich versuche, diesen Code zu verwenden:
SPFile file = web.GetFile("_layouts/My Folder/MyPage.aspx");
Dieser Code gibt a zurück File not found exception
.
Wie kann ich einen Verweis auf diese Seite erhalten?Tritt dieser Fehler auf, weil die Seite noch nicht bereitgestellt wurde?
Lösung
Danke für Spongeroberto Squarepantalones
Und SPArchaeologist
Hilfe, ich habe folgendes gemacht:
- Ich habe eine erstellt
Module
in meiner SharePoint-Lösung hinzugefügt und eine hinzugefügtaspx
Seite. - In diesem
aspx
Seite, die ich hinzugefügt habeWebPartPages:SPWebPartManager
und einWebPartPages:WebPartZone
. - Ich habe das bearbeitet
Elements.xml
Datei im Modul, um die Seite in einem bereitzustellenDocument Library
.(Ich muss nur von einer bestimmten Site aus auf diese Seite zugreifen.) - Im
FeatureActivated
Methode in derFeature Event Receiver
Ich habe Code hinzugefügt, um einen zu erstellenWebPart
, holen Sie sich diese Seite alsSPFile
und benutzte einSPLimitedWebPartManager
um meine erstellten hinzuzufügenWebPart
.(Ich habe dies getan und keine erstelltWepPart
imaspx
Seite direkt, da das WebPart SharePoint-Elemente von a anzeigtDocument Library
und verwenden Sie einen SharePointView
die in derselben Lösung bereitgestellt werden, daher ändert sich ihre GUID immer).
Andere Tipps
Elemente werden bereitgestellt Vor der Ereignisempfänger.Das Problem besteht darin, dass Sie versuchen, eine Hive-Datei zu lesen.Das wird mit der SPWeb.GetFile-Methode nicht funktionieren.Diese Methode ist für Dateien gedacht, die in diesem Web gespeichert sind.
Sie können die Datei jedoch weiterhin lesen.Ich musste das Gleiche tun und habe eine Methode wie diese geschrieben:
/// <summary>
/// get the proper path to the hive
/// </summary>
private static string GetUtilPath(string path)
{
return SPUtility.GetGenericSetupPath(@"TEMPLATE\LAYOUTS\MyModule\" + path);
}
/// <summary>
/// Access a file in the SharePoint hive
/// </summary>
/// <param name="path">the path relative to the layouts folder</param>
private static byte[] GetHiveFile(string path)
{
string utilPath = GetUtilPath(path);
using(FileStream fs = new FileStream(utilPath, FileMode.Open, FileAccess.Read))
{
BinaryReader br = new BinaryReader(fs);
long numbytes = new FileInfo(utilPath).Length;
return br.ReadBytes((int)numbytes);
}
}
Dann können Sie eine Datei aus dem Hive wie folgt lesen:
byte[] file = GetHiveFile(@"myfolder\myfile.txt");
Basierend auf anderen Antworten (siehe Das oder Das) SPFile.GetFile(string) kann nicht verwendet werden, um eine „SPFile“ im _layout-Ordner abzurufen.Es gibt andere Möglichkeiten, die Seite zu lesen (wie in einer Antwort vorgeschlagen), aber am Ende würden Sie nur einen Stream/Bytearray oder ähnliches erhalten – Sie versuchen, ein Webpart hinzuzufügen, also befürchte ich, dass das nicht wirklich helfen würde.Das liegt daran, dass _layout für SharePoint ein virtueller IIS-Ordner ist und die darin enthaltenen Dateien NICHT als SP-Datei angesehen werden.
Allerdings wird das Hinzufügen eines Webparts zu einer Anwendungsseite meines Wissens nicht einmal unterstützt:Wenn Sie versuchen, eine Webpartzone mit einem darin enthaltenen Webpart hinzuzufügen, sollten Sie eine Fehlermeldung ähnlich der „Unbekanntes Server-Tag WebPartZone“ erhalten (siehe dieser Blog oder diese Antwort von Dave).Webparts auf der Anwendungsseite sind nur möglich, wenn sie als Standard-Websteuerung verwendet werden (und selbst dort gibt es einige Probleme mit der Zwischenspeicherung usw.).
Wenn du müssen, Ihre beste Lösung scheint es zu sein, die Datei programmgesteuert wie eine Textdatei zu öffnen und dann die erforderlichen Tags manuell hinzuzufügen – Sie können den Webpart-Manager nicht verwenden.Wie auch immer, ich würde versuchen, diese Seite erneut in einer Seitenbibliothek oder ähnlichem bereitzustellen und sie in eine Standardveröffentlichungsseite umzuwandeln.