Pregunta

Tengo un elemento web personalizado, estoy intentando realizar una transición con un solo clic desde WebPartManager.BrowseDisplayMode a SPControlMode.Edit.Desafortunadamente, no existe una forma directa de realizar la transición entre estos dos modos tan diferentes.Pero he construido, tal vez un proceso exitoso, pero necesito ayuda, ya que el comportamiento es un poco tonto.

Entonces tengo un botón de enlace, con el texto "Editar", en caso de que las Propiedades no estén configuradas.Esta situación sería el caso en el que alguien entra y coloca los controles en una página y luego completa las propiedades para su ejecución.

Evento de clic en el botón de enlace:

void lbtnViewEdit_Click ( object sender , EventArgs e ) {
    if ( WebPartManager.DisplayMode == WebPartManager.BrowseDisplayMode) {
        WebPartManager.DisplayMode = WebPartManager.DesignDisplayMode;
        //SPContext.Current.FormContext.SetFormMode( SPControlMode.Edit , false );
    }
}

Y luego comencé a jugar con la configuración de FormContext DisplayMode.Actualmente se encuentra en el CreateChildControls() evento, mientras jugaba con los modelos de eventos.

protected override void CreateChildControls () {
    if ( WebPartManager.DisplayMode == WebPartManager.DesignDisplayMode ) {
        SPContext.Current.FormContext.SetFormMode( SPControlMode.Edit , false );
    }

    base.CreateChildControls();
}

El comportamiento que estoy experimentando actualmente, tal vez un comportamiento de devolución de datos, pero no estoy seguro.

Desde el BrowseDisplayMode (Página publicada), veo el botón Editar enlace.Pero cuando hago clic en el botón Editar, tengo que hacer clic dos veces para llegar al SPControlMode.Edit Modo.El segundo clic en LinkButton me lleva a la pantalla en la que quiero estar, pero me gustaría que fuera una transición de un solo clic desde una vista de página publicada a una pantalla de edición, similar a hacer clic en el Edit de la cinta.

Cualquier ayuda sobre qué proceso debo utilizar sería muy apreciada.

¿Fue útil?

Solución 2

Aquí estaba mi implementación final sin usar el JavaScript modelo para realizar la evaluación

if ( WebPartManager.DisplayMode == WebPartManager.BrowseDisplayMode ) {

} else if (WebPartManager.DisplayMode == WebPartManager.DesignDisplayMode) {

}

Hago esto en mi PageLoad, pero teóricamente podrías colocar este bloque de control en cualquier lugar donde necesites realizar una lógica condicional basada en el modo actual en el que se encuentra la página/parte web.

Luego anulé algunos eventos:

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();
}

Otros consejos

Hay algunas cosas adicionales que debes hacer si estás en una página de publicación.Este es el código JavaScript con el que he tenido éxito en el pasado al hacer lo que me pides:

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);                
    }
}
Licenciado bajo: CC-BY-SA con atribución
scroll top