Doble carga de mi página con un control extendido

Answered Doble carga de mi página con un control extendido

  • Wednesday, May 09, 2007 9:18 AM
    Moderator
     
     

    Buenos hoy me toca preguntar a mí:

     

    He creado un control extendiendo de Image:

     

    Code Snippet

    using System;

    using System.Text;

    using System.Collections;

    using System.Collections.Generic;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.ComponentModel;

    namespace Optima.Framework.Web.UI.WebControls

    {

    /// <summary>

    /// Control que simula un MatchCode de SAP para ASP.NET.

    /// </summary>

    public class ImageButtonMatchCode : Image

    {

    private List<String> _parametros;

    private List<String> _textboxes;

    [Bindable(true), Browsable(false), Category("MatchCode"), Description("Url del MatchCode")]

    public string Url

    {

    get

    {

    return ViewState["Url"] != null ? ViewState["Url"].ToString() : String.Empty;

    }

    set

    {

    ViewState["Url"] = value;

    }

    }

    [Bindable(true), Browsable(false), Category("MatchCode"), Description("Assembly que se carga")]

    public string Assembly

    {

    get

    {

    return ViewState["Assembly"] != null ? ViewState["Assembly"].ToString() : String.Empty;

    }

    set

    {

    ViewState["Assembly"] = value;

    }

    }

    [Bindable(true), Browsable(false), Category("MatchCode"), Description("Clase que contine los métodos")]

    public string Clase

    {

    get

    {

    return ViewState["Clase"] != null ? ViewState["Clase"].ToString() : String.Empty;

    }

    set

    {

    ViewState["Clase"] = value;

    }

    }

    [Bindable(true), Browsable(false), Category("MatchCode"), Description("Método a ejecutar")]

    public string Metodo

    {

    get

    {

    return ViewState["Metodo"] != null ? ViewState["Metodo"].ToString() : String.Empty;

    }

    set

    {

    ViewState["Metodo"] = value;

    }

    }

    [Bindable(true), Browsable(false), Category("MatchCode"), Description("Número de las columnas cuyo valor se retornará al seleccionar una línea en el GridView del matchcode")]

    public string Columnas

    {

    get

    {

    return ViewState["Columnas"] != null ? ViewState["Columnas"].ToString() : String.Empty;

    }

    set

    {

    ViewState["Columnas"] = value;

    }

    }

    [Bindable(true), Browsable(false), Category("MatchCode"), Description("Parámetros del método")]

    public List<String> Parametros

    {

    get

    {

    if (ViewState["Parametros"] == null)

    {

    _parametros = new List<String>();

    ViewState["Parametros"] = _parametros;

    }

    return (List<String>)ViewState["Parametros"];

    }

    }

    [Bindable(true), Browsable(false), Category("MatchCode"), Description("Textboxes para cargar los datos")]

    public List<String> TextBoxes

    {

    get

    {

    if (ViewState["TextBoxes"] == null)

    {

    _textboxes = new List<String>();

    ViewState["TextBoxes"] = _textboxes;

    }

    return (List<String>)ViewState["TextBoxes"];

    }

    }

    protected override void OnPreRender(EventArgs e)

    {

    StringBuilder sbUrlCompuesta = new StringBuilder();

    int iContText = 0;

    StringBuilder sbParametros = new StringBuilder();

    foreach (string param in this.Parametros)

    {

    sbParametros.Append(param + ";");

    }

    sbParametros.Length -= 1;

    sbUrlCompuesta.Append(this.Url);

    sbUrlCompuesta.Append(String.Format("?assembly={0}&clase={1}&metodo={2}&parametros={3}&columnas={4}", this.Assembly, this.Clase, this.Metodo, sbParametros.ToString(), this.Columnas));

    StringBuilder sb = new StringBuilder();

    sb.Append("\r\n<script language='JavaScript'>\r\n");

    sb.Append("\r\n");

    sb.Append(String.Format("function ShowMatchCode{0}()", this.ID));

    sb.Append("\r\n");

    sb.Append("{" + "\r\n");

    sb.Append(String.Format("\tvar ret = window.showModalDialog('{0}','','resizable=no;dialogWidth:800px;dialogHeight:600px;help:no;maximize:yes;minimize:yes;scrollbars:yes;');", sbUrlCompuesta.ToString()));

    sb.Append("\r\n\tif (ret != null)");

    sb.Append("\r\n");

    sb.Append("\t{" + "\r\n");

    foreach (String txt in this.TextBoxes)

    {

    sb.Append(String.Format("\tdocument.getElementById('{0}').innerText=ret[{1}];\r\n", txt, iContText));

    iContText++;

    }

    sb.Append("\r\n");

    sb.Append("\t}" + "\r\n");

    sb.Append("}" + "\r\n");

    sb.Append("</script>");

    if (!this.Page.ClientScript.IsStartupScriptRegistered("MatchCode"))

    {

    this.Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "MatchCode", sb.ToString());

    }

    this.Attributes.Add("OnClick", String.Format("ShowMatchCode{0}();return false;", this.ID));

    this.Attributes.Add("OnMouseOver", "this.style.cursor = 'hand';");

    base.OnPreRender(e);

    }

    }

    }

     

    Lo añado  a mi página, compilo, ejecuto y se produce una doble carga, es decir me entra 2 veces por aquí if (!this.IsPostBack):

     

    Code Snippet

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!this.IsPostBack)

        {

            this._presenter.OnViewInitialized();

            this._presenter.GetCabecera(5);

            this.InitMatchCode();

        }

        this._presenter.OnViewLoaded();

    }

     

    Any Idea???

     

    Salu2

All Replies

  • Wednesday, May 09, 2007 10:51 AM
    Moderator
     
     

     

    Hola Luis,

     

    Menudas preguntitas jejejeje

     

    La clave debe estar en como defines el objeto _presenter

     

    O que es lo que hace la funcion InitMatchCode()

     

    Especificalas a ver si te puedo ayudar.

     

    A mi me paso esto hace tiempo... pero no me acuerdo de nada de lo que hice la verdad.

     

    Tiene que ver algo con que se invoca algun evento antes del load... pero no recuerdo.

     

    Un saludo.

  • Wednesday, May 09, 2007 11:03 AM
    Moderator
     
     

    Hola Javier:

     

    La cosa debe estar en el puñetero control porque si le quito no pasa pero no entiendo que estoy haciendo mal, de todas maneras te dejo el código de la página:

     

    Code Snippet

    using System;

    using System.Data;

    using System.Configuration;

    using System.Collections;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

    using CLH.Facturacion.Cabeceras;

    using CLH.Facturacion.Cabeceras.Views;

    using Microsoft.Practices.ObjectBuilder;

    using Optima.Framework.Web.UI.WebControls;

    public partial class Cabeceras_Default : System.Web.UI.Page, IDefaultView

    {

    private DefaultViewPresenter _presenter;

    protected void Page_Load(object sender, EventArgs e)

    {

    if (!this.IsPostBack)

    {

    this._presenter.OnViewInitialized();

    this._presenter.GetCabecera(5);

    this.InitMatchCode();

    }

    this._presenter.OnViewLoaded();

    }

    [CreateNew]

    public DefaultViewPresenter Presenter

    {

    set

    {

    this._presenter = value;

    this._presenter.View = this;

    }

    }

    #region IDefaultView Members

    public Cabecera Cabecera

    {

    set { ObjectContainerDataSource1.DataSource = value; }

    }

    #endregion

    protected void ObjectContainerDataSource1_Updated(object sender, Microsoft.Practices.Web.UI.WebControls.ObjectContainerDataSourceStatusEventArgs e)

    {

    this._presenter.OnUpdated((Cabecera)e.Instance);

    }

    private void InitMatchCode()

    {

    ImageButtonMatchCode ImageButtonMatchCodeClientes = (ImageButtonMatchCode)DetailsView1.FindControl("ImageButtonMatchCodeClientes");

    ImageButtonMatchCodeClientes.Url = "../MatchCode.aspx";

    ImageButtonMatchCodeClientes.Parametros.Add("");

    ImageButtonMatchCodeClientes.Parametros.Add("");

    ImageButtonMatchCodeClientes.TextBoxes.Add(((TextBox)DetailsView1.FindControl("TextBox1")).ID);

    ImageButtonMatchCodeClientes.TextBoxes.Add(((TextBox)DetailsView1.FindControl("TextBox2")).ID);

    ImageButtonMatchCodeClientes.Assembly = "Clientes.dll";

    ImageButtonMatchCodeClientes.Clase = "Facturacion.Clientes.OracleDataAccess";

    ImageButtonMatchCodeClientes.Metodo = "GetClientes";

    ImageButtonMatchCodeClientes.Columnas = "0,1";

    }

    }

     

    Salu2

     

     

  • Wednesday, May 09, 2007 11:32 AM
    Moderator
     
     

     

    Hola de nuevo Luis...

     

    Pues no se... la verdad es que me gustaria verlo funcionando jejejej y ponerle unos puntos de interrupcion.

     

    De todas meneras hay una linea en concreto del control que no me gusta (no se, la he visto un poco rara).... esa que dice.... base.OnPreRender(e);

     

    De todas meneras implementa todos los metodos que heredas de WebControl... a ver si esta pasando por alguno de ellos (del base) y te esta jorobando.

     

    Un saludo.

  • Wednesday, May 09, 2007 11:49 AM
     
     

    Realmente es un efecto dificil de entender.. yo tampoco veo cual es el problema

    Algunas ideas para sumar (entre todos a lo mejor alguno da en la tecla)

    • Aunque sin el control no te ocurre el problema, tampoco creo que sea solamente algo del control: copié el control a una class library, lo incluí en una página nueva y no causa ese efecto que describes.
    • Estas usando ASP.NET AJAX en la página? eso a veces puede causar más de una invocación de la misma, según qué controles intervengan en el UpdatePanel
    • Qué hace el código del _presenter ? No estará invocando de nuevo a esa página de cabecera?
    • Usas algun tipo de frameset con más de un frame?

    Otra cosa que me llama la atención es el código del control.... en el PreRender construyes cuidadosamente un sbUrlCompuesta y despues no lo usas para nada (envias al RegisterStartupScript un sb vacío)

     

    Exito con la solución del problema! Mantennos al tanto...

    Saludos

    Jose.

  • Wednesday, May 09, 2007 1:14 PM
    Moderator
     
     Answered

    SOLUCIONADO!!!

     

    Es un pequeño bug de ASP.NET que podeís comprobar vosotros mismos al no poner a un control Image una ruta de una imagen en su propiedad ImageUrl y al renderizarse en esta etiqueta:

     

    <IMG SRC="#">

     

    se recarga 2 veces la página, si le poneis una imagen no pasa.

     

    Curioso, no???

     

    Salu2

     

  • Wednesday, May 09, 2007 1:37 PM
    Moderator
     
     

     

    jode...

     

    si es curioso si...

     

    me la apunto

     

    eres un astro Luis jejeje

     

    Por cierto... ya he puesto mi segunda entrega de la Iniciativa FAQ en Foros MSDN y NewsGroup ASP.NET en mi web.

     

    Y tengo ya unas cuantas ideas para nuevas aportaciones a la iniciativa... como:

     

    - Uso de un DataGrid, desde el principio a soluciones avanzadas.

     

    - Crear un login en asp.net

     

    por poner un par de ejemplos...

     

    Si quereis nos organizamos un poco.

     

    Saludos.

  • Wednesday, May 09, 2007 1:53 PM
    Moderator
     
     

    Si Javier, quizás sería buena idea que nos habilitaran un foro aquí para poner el FAQ y estaría mejor centralizado no crees.

     

    Podemos moverlo a ver si conseguimos algo con Microsoft.

     

    Salu2

  • Wednesday, May 09, 2007 1:54 PM
    Moderator
     
     

    Ah se me olvidaba ya he puesto yo mi segunda entrega reflejando este mismo problema:

     

    http://geeks.ms/blogs/lruiz/archive/2007/05/09/faq-el-evento-oninit-y-page-load-se-ejecutan-2-veces.aspx

     

    Salu2

  • Wednesday, May 09, 2007 2:23 PM
    Moderator
     
     
     Luis Ruiz Pavón Escribió:

    Ah se me olvidaba ya he puesto yo mi segunda entrega reflejando este mismo problema:

     

    http://geeks.ms/blogs/lruiz/archive/2007/05/09/faq-el-evento-oninit-y-page-load-se-ejecutan-2-veces.aspx

     

    Salu2

     

    hombre Luis...

     

    No se si una duda tuya propia puede considerarse como FAQ (siglas de preguntas mas frecuentes) jejejeje

     

    Pero sirve

     

    Me parece una idea estupenda lo del foro para la iniciativa, asi lo tenemos mas centralizado y accesible para todos.

     

    ¿Como lo movemos?

     

    Un saludo.

  • Wednesday, May 09, 2007 3:28 PM
    Moderator
     
     

    Pues sí tienes razón Wink

     

    Para moverlo deberíamos poner nuestra sugerencia quí:

     

    http://www.microsoft.com/spanish/msdn/latam/contacto/

     

    Salu2

  • Thursday, May 10, 2007 5:03 PM
    Moderator
     
     

     

    Dicho y hecho:

     

    Mira:

     

    Descripción:

     
      Hola Luis Riuz Pavon y yo estamos creando una iniciativa para respondear las dudas ms frecuentes en el Foro de MSDN de España nos gustaria tener un apartado en el foro donde poder postear estos articulos para tenerlos mas centralizados. Un saludo.

     

    Respuesta:

     

      Estimado Javier,
     
      Le informamos que hemos derivado su consulta a los responsables del foro, los cuales analizarán el mismo para ver si es posible implementarlo.

     

    Atentamente,

    MSDN Latinoamérica.

     

  • Monday, May 21, 2007 4:15 PM
    Moderator
     
     

    Guay tio a ver si sale.

     

    Salu2