Изменение режима с BrowseDisplayMode на режим редактирования
-
10-12-2019 - |
Вопрос
У меня есть пользовательская веб-часть, я пытаюсь выполнить переход в один клик от WebPartManager.BrowseDisplayMode
к SPControlMode.Edit
.К сожалению, не существует прямого способа перехода между этими двумя очень разными режимами.Но я построил, возможно, успешный процесс, но мне нужна помощь, так как поведение довольно глупое.
Итак, у меня есть кнопка ссылки с текстом «Изменить» на тот случай, если свойства не установлены.Это может быть тот случай, когда кто-то входит и помещает элементы управления на страницу, а затем позже заполняет свойства для выполнения.
Событие нажатия кнопки ссылки:
void lbtnViewEdit_Click ( object sender , EventArgs e ) {
if ( WebPartManager.DisplayMode == WebPartManager.BrowseDisplayMode) {
WebPartManager.DisplayMode = WebPartManager.DesignDisplayMode;
//SPContext.Current.FormContext.SetFormMode( SPControlMode.Edit , false );
}
}
А затем я начал экспериментировать с настройками FormContext DisplayMode.В настоящее время оно находится в CreateChildControls()
event, когда я играл с моделями событий.
protected override void CreateChildControls () {
if ( WebPartManager.DisplayMode == WebPartManager.DesignDisplayMode ) {
SPContext.Current.FormContext.SetFormMode( SPControlMode.Edit , false );
}
base.CreateChildControls();
}
Поведение, которое я сейчас испытываю, возможно, поведение обратной передачи, но я не уверен.
Из BrowseDisplayMode
(Опубликованная страница), я вижу кнопку «Редактировать ссылку».Но когда я нажимаю кнопку «Изменить», мне приходится щелкнуть ее дважды, чтобы перейти к SPControlMode.Edit
Режим.Второй щелчок LinkButton переводит меня на экран, на котором я хочу находиться, но я бы хотел, чтобы это был переход одним щелчком мыши от просмотра опубликованной страницы к экрану редактирования, аналогично нажатию кнопки Edit
из ленты.
Буду очень признателен за любую помощь в выборе процесса, который мне следует использовать.
Решение 2
Вот моя окончательная реализация без использования JavaScript
модель для выполнения оценки
if ( WebPartManager.DisplayMode == WebPartManager.BrowseDisplayMode ) {
} else if (WebPartManager.DisplayMode == WebPartManager.DesignDisplayMode) {
}
Я делаю это в PageLoad, но теоретически вы можете разместить этот блок управления в любом месте, где вам нужно выполнить условную логику на основе текущего режима, в котором находится страница/веб-часть.
Затем я переопределил некоторые события:
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();
}
Другие советы
Если вы находитесь на странице публикации, вам нужно сделать кое-что еще.Это код JavaScript, с которым мне удалось добиться успеха в прошлом, выполняя то, что вы просите:
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);
}
}