Diseño de control de usuario reutilizable (ASCX) para múltiples aplicaciones web -- # campo con asp.net camp codereview Relacionados El problema

Reusable user control (ascx) design for multiple web application


4
vote

problema

Español

Los proyectos de aplicación web de mi empresa se basan en gran medida en los controles de los usuarios. Un caso común es como queremos reutilizar los elementos visuales de la UI, pero note la lógica original envasada.

He leído un código muy maloliente en algún código de controles de usuario.

  if(WebConfig.CurrentProject == "xxx") {     //do xxx's logic     ddlPostalCode.DataSouce= this.addressManager.getUSAPostal(); } else {     //do yyy's logic     ddlPostalCode.DataSouce= this.addressManager.getUKPostal(); }  //Or use configuration  if(config.enableAlpha) {    //Do alpha's logic     ddlPostalCode.DataSouce= this.addressManager.getAlphaPostalCode(); }   

y estas lógicas normalmente involucran manipulaciones de controles de servidor.

Así que estoy pensando, si solo queremos reutilizar el elemento visual y las partes de su lógica. ¿Por qué no hacemos públicos el servidor y su manejador de eventos?

  //In xxx.ascx.cs public EventHandler AddressControl_Init;  protected override void OnInit(EventArgs e) {      if(this.AddressControl_Init!= null)      {          this.AddressControl_Init(sender, e);      }      else      {         //Default logic.      } }  //In xxx.ascx.designer.cs public  public global::XYZ.Controls.Basic.XYZDropDownList ddlPostalCode;  //In the code behinde of the page using this address ascx. //HostingPage.aspx.cs protected override void OnPreInit(EventArgs e) {     this.AddressControl.AddressControl_Init += new EventHandler(USAAddressControl_Init); }  void USAAddressControl_Init(object sender, EventArgs e) {     //Now i can use any business manager class here to populate the source data.     this.AddressControl.ddlPostalCode.DataSource = Anymanager.GetMarsCode();     this.AddressControl.ddlPostalCode.DataBind(); }   

Este es un ejemplo muy simple, pero también puede ser una solución muy flexible. Desactiva la lógica detrás del control del usuario. Deje que el usuario, la página deside la lógica del control.

¿Hay alguna forma mejor elegante de resolver mi problema?

Original en ingles

My company's web application projects are heavily based on user controls. One common case is like we want to reuse the UI visual elements but note the packaged original logic .

I have read some very smelly code in some user controls code behinde.

if(WebConfig.CurrentProject == "xxx") {     //do xxx's logic     ddlPostalCode.DataSouce= this.addressManager.getUSAPostal(); } else {     //do yyy's logic     ddlPostalCode.DataSouce= this.addressManager.getUKPostal(); }  //Or use configuration  if(config.enableAlpha) {    //Do alpha's logic     ddlPostalCode.DataSouce= this.addressManager.getAlphaPostalCode(); } 

And these logics normally involving manipulating server controls .

So I am thinking, if we just want to reuse the visual element and parts of its logic. Why don't we make the server and its event handler public ?

//In xxx.ascx.cs public EventHandler AddressControl_Init;  protected override void OnInit(EventArgs e) {      if(this.AddressControl_Init!= null)      {          this.AddressControl_Init(sender, e);      }      else      {         //Default logic.      } }  //In xxx.ascx.designer.cs public  public global::XYZ.Controls.Basic.XYZDropDownList ddlPostalCode;  //In the code behinde of the page using this address ascx. //HostingPage.aspx.cs protected override void OnPreInit(EventArgs e) {     this.AddressControl.AddressControl_Init += new EventHandler(USAAddressControl_Init); }  void USAAddressControl_Init(object sender, EventArgs e) {     //Now i can use any business manager class here to populate the source data.     this.AddressControl.ddlPostalCode.DataSource = Anymanager.GetMarsCode();     this.AddressControl.ddlPostalCode.DataBind(); } 

This is a very simple example, but it also can be a very flexsiable solution. It decouple the logic behinde the user control. Let the user, the page to deside the control's logic.

Is there any better elegent ways to solve my problem?

     

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

¿Hay alguna forma mejor elegante de resolver mi problema?

Usted está bajando un camino horrible jugando con todos estos controles de usuario. ASP.NET MVC es mucho mejor para tratar las partes visuales reutilizables, y todo sucede en el nivel de solicitud, por lo que no tiene que preocuparse por el horrible ordenamiento de eventos.

¿No puedes usar MVC? Olvídate de los complejos eventos de los controles de usuario por completo. No ponga ningún código en los controles de usuario. Si necesita los datos de un cuadro de texto en un control, por ejemplo, tire de él directamente desde las variables de publicación (envíe esto en una clase si necesita)

Haga que su objetivo se ocupe de las solicitudes en un solo punto centralizado. Es la forma de MVC, es la forma del MVP, es el MVVM WAY.

necesito ajax? El chatarra Ajax controla y pulsa un servicio web; Deseche el kit de herramientas AJAX.

De hecho, me gustaría tener una antigua aplicación de formas web Crufty para que pueda volver a trabajar. Me fijaría por completo en el fracaso que es ASP. ciclo de vida neto

 

Is there any better elegent ways to solve my problem?

You are going down a horrible path messing with all these user controls. ASP.NET MVC is much better for dealing with reusable visual parts, and everything happens on the request level so you don't have to worry about horrible event ordering.

Can't use MVC? Forget the complex events of user controls entirely. Put no code in user controls. If you need the data from a textbox in a control for example, pull it directly from the post variables (wrap this in a class if you need to)

Make your goal to deal with requests in a SINGLE, centralized point. It's the MVC way, it's the MVP way, it's the MVVM way.

Need ajax? scrap ajax controls and hit a web service; throw away the ajax toolkit.

I actually wish I had an old crufty webforms app that I could re-work this on. I would completely bail on the failure that is asp.net lifecycle

 
 
2
 
vote

Parece que todo lo que necesita es acceder a sus controles en UserControl directamente en HostingPage.aspx.cs. Puedes hacerlos públicos. Solo encuentra la declaración y cámbielo al público. Luego, puede acceder a ellos directamente en el método init de la página de hosting, no necesita evento para eso.

La solución más agradable sería crear propiedades públicas en su USERCONTROL y usarlas para pasar datos de la página de hosting a UserControl y luego hacer su enlace enlazando allí.

No creo que use usercontrols sea malo, pueden ser una herramienta muy poderosa. Le sugiero que defina las interfaces y luego accede a UserControls a través de ellos. En este caso, también puede cargarlos dinámicamente sin ningún problema.

 

It looks like all you need is to access your controls in usercontrol directly in HostingPage.aspx.cs. You can make them public. Just find the declaration and change it to public. Then you can access them directly in Init method of HostingPage, you don't need event for that.

Nicer solution would be to create public properties in your usercontrol and use them to pass data from HostingPage to usercontrol and then do your binding bind there.

I don't think using usercontrols is bad, they can be very powerful tool. I suggest you to define interfaces and then access usercontrols trough them. In this case you can also load them dinamically with no problem.

 
 

Relacionados problema

3  MARCA DE TEXTBOX JavaScript de doble modo  ( Dual mode javascript textbox watermark ) 
Solo estaba tratando de hacer una marca de agua AJAX alternativa desde "Fecha de inserción" (primer modo) a "MM / DD / YYAY" (segundo modo). Después de algún ...

4  Envoltura de sesión  ( Session wrapper ) 
Tengo dos tipos de envoltorios de sesión: tipo 1 public class SessionHandler { public static SessionHandler CurrentSession { get ...

3  Master Detalle Insertar en Entity Framework 6 Base de datos Primer MVC 5  ( Master detail insert in entity framework 6 database first mvc 5 ) 
Tengo un DB con una tabla maestra llamada "Facturas" y otra tabla de detalles "Facturas_Detalle". Me gustaría insertarlos, por lo que esta es una "base de dat...

1  Inserte el elemento seleccionado en ListBox usando ADO.NET y STOR PROC  ( Insert selected item in listbox using ado net and stor proc ) 
He creo este método de clase para ingresar el formulario de elementos seleccionados, lista de verificación para el recurso asociado, utilizo ADO.NET & AMP; La...

3  Aplicación externa para la implementación de la aplicación web  ( External application for the web application deployment ) 
Necesito una aplicación externa que ayude a la implementación de la aplicación web. La aplicación debe crear la base de datos 99887766665544330 en el SQL Se...

6  API web y procedimientos almacenados  ( Web api and stored procedures ) 
Estoy creando un servicio web que obtiene datos a través de procedimientos almacenados de un DB y proporciona el resultado como JSON. La solución se construye...

2  Diferente enfoque a la siguiente acción ASP.NET WEB API  ( Different approach to the following asp net web api action ) 
Tal vez alguien aquí puede ayudarme a resolver esta implementación y hacerlo mejor. Primero las siguientes restricciones: 1 controlador & amp; Acción que...

3  Diseño de 3 capas y conjunto de datos múltiples  ( 3 layer design and multiple dataset ) 
Soy nuevo en la programación C # y OO. Tengo una página ASPX con 3 listas de casillas de verificación y me gustaría generarlas desde el DB. ¿Cómo debo estruct...

3  Paginación personalizada en ASP.NET Aplicación web  ( Custom paging in asp net web application ) 
Tengo un código siguiente para hacer una paginación personalizada desde una aplicación web ASP.NET. puntos de interés usa los botones de enlace como se...

4  NHIBERNATE (UOW) + patrón de ccommand  ( Nhibernate uow ccommand pattern ) 
Estoy construyendo una aplicación ASP.NET MVC y me gustaría algunos comentarios para mi manera de consultar / ejecutar declaraciones al ORM. Estoy usando nh...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos