Doble carga de mi página con un control extendido
-
Wednesday, May 09, 2007 9:18 AMModerator
Buenos hoy me toca preguntar a mí:
He creado un control extendiendo de Image:
Code Snippetusing
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}¶metros={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 Snippetprotected 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 AMModerator
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 AMModerator
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 Snippetusing
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 AMModerator
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 PMModerator
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 PMModerator
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 PMModerator
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 PMModerator
Ah se me olvidaba ya he puesto yo mi segunda entrega reflejando este mismo problema:
Salu2
-
Wednesday, May 09, 2007 2:23 PMModerator
Luis Ruiz Pavón Escribió: Ah se me olvidaba ya he puesto yo mi segunda entrega reflejando este mismo problema:
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 PMModerator
Pues sí tienes razón

Para moverlo deberíamos poner nuestra sugerencia quí:
http://www.microsoft.com/spanish/msdn/latam/contacto/
Salu2
-
Thursday, May 10, 2007 5:03 PMModerator
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 PMModerator
Guay tio a ver si sale.
Salu2

