Ändern des Modus vom BrowseDisplayMode in den Bearbeitungsmodus
-
10-12-2019 - |
Frage
Ich habe ein benutzerdefiniertes Webpart und versuche, einen Übergang mit einem Klick durchzuführen WebPartManager.BrowseDisplayMode
Zu SPControlMode.Edit
.Leider gibt es keine direkte Möglichkeit, zwischen diesen beiden sehr unterschiedlichen Modi zu wechseln.Aber ich habe vielleicht einen erfolgreichen Prozess aufgebaut, brauche aber etwas Hilfe, da das Verhalten irgendwie albern ist.
Ich habe also einen Link-Button mit dem Text „Bearbeiten“, für den Fall, dass die Eigenschaften nicht festgelegt sind.Diese Situation wäre der Fall, wenn jemand hereinkommt und die Steuerelemente auf einer Seite ablegt und dann später die Eigenschaften zur Ausführung ausfüllt.
Link-Button-Klick-Ereignis:
void lbtnViewEdit_Click ( object sender , EventArgs e ) {
if ( WebPartManager.DisplayMode == WebPartManager.BrowseDisplayMode) {
WebPartManager.DisplayMode = WebPartManager.DesignDisplayMode;
//SPContext.Current.FormContext.SetFormMode( SPControlMode.Edit , false );
}
}
Und dann fing ich an, mit den FormContext DisplayMode-Einstellungen herumzuspielen.Derzeit befindet es sich in der CreateChildControls()
Event, da ich mit den Event-Modellen gespielt habe.
protected override void CreateChildControls () {
if ( WebPartManager.DisplayMode == WebPartManager.DesignDisplayMode ) {
SPContext.Current.FormContext.SetFormMode( SPControlMode.Edit , false );
}
base.CreateChildControls();
}
Das Verhalten, das ich derzeit erlebe, ist möglicherweise ein Postback-Verhalten, aber ich bin mir nicht sicher.
Von dem BrowseDisplayMode
(Veröffentlichte Seite), ich sehe den Edit LinkButton.Aber wenn ich auf die Schaltfläche „Bearbeiten“ klicke, muss ich zweimal darauf klicken, um zum zu gelangen SPControlMode.Edit
Modus.Der zweite Klick auf den LinkButton bringt mich zu der Anzeige, in der ich sein möchte, aber ich möchte, dass es sich um einen Übergang mit einem einzigen Klick von der Ansicht „Veröffentlichte Seite“ zu einer Anzeige „Bearbeiten“ handelt, ähnlich wie beim Klicken auf Edit
aus dem Band.
Für jede Hilfe, welchen Prozess ich verwenden sollte, wäre ich sehr dankbar.
Lösung 2
Hier war meine endgültige Implementierung ohne Verwendung von JavaScript
Modell zur Durchführung der Auswertung
if ( WebPartManager.DisplayMode == WebPartManager.BrowseDisplayMode ) {
} else if (WebPartManager.DisplayMode == WebPartManager.DesignDisplayMode) {
}
Ich mache das in meinem PageLoad, aber theoretisch könnten Sie diesen Kontrollblock überall dort platzieren, wo Sie bedingte Logik basierend auf dem aktuellen Modus ausführen müssen, in dem sich die Seite/das Webpart befindet.
Dann habe ich einige Ereignisse überschrieben:
protected override void CreateChildControls () {
if ( WebPartManager.DisplayMode == WebPartManager.DesignDisplayMode ) {
SPContext.Current.FormContext.SetFormMode( SPControlMode.Edit , false );
}
base.CreateChildControls();
}
protected override void OnPreRender ( EventArgs e ) {
if ( ProviderPart != null ) {
ProviderPart.GetParametersData( new ParametersCallback( SetProviderData ) );
}
base.OnPreRender( e );
}
protected override void OnInit ( EventArgs e ) {
base.OnInit( e );
InitializeControl();
}
Andere Tipps
Es gibt einige zusätzliche Dinge, die Sie tun müssen, wenn Sie sich auf einer Veröffentlichungsseite befinden.Dies ist der JavaScript-Code, mit dem ich in der Vergangenheit erfolgreich war und das getan habe, was Sie verlangen:
function ChangeToEditMode(){
if (window.location.search.match("[?&]PageView=Shared")){
var inDesignMode = document.forms[MSOWebPartPageFormName].MSOLayout_InDesignMode.value;
if (inDesignMode == "1")
{
// page is in edit mode
}
}
else{
if (document.forms["aspnetForm"]["MSOLayout_InDesignMode"] != null)
document.forms["aspnetForm"]["MSOLayout_InDesignMode"].value = 1;
if (document.forms["aspnetForm"]["MSOAuthoringConsole_FormContext"] != null)
document.forms["aspnetForm"]["MSOAuthoringConsole_FormContext"].value = 1;
if (document.forms["aspnetForm"]["MSOSPWebPartManager_DisplayModeName"] != null)
document.forms["aspnetForm"]["MSOSPWebPartManager_DisplayModeName"].value = "Design";
ChangeLayoutMode(false);
}
}