¿Cómo puedo acceder a un control del lado del servidor en un código detrás de mi proyecto MVC?

StackOverflow https://stackoverflow.com/questions/1014987

Pregunta

En primer lugar, permítanme decir que sé que acceder a los controles del lado del servidor en mi Vista está mal visto en MVC. Sin embargo, necesito hacerlo en mi situación (hasta donde puedo ver). Aquí está mi historia. :)

Tengo un control de terceros que estoy usando en mi aplicación web. Actualmente me han dado la tarea de portar nuestra solución de WebForms a MVC. Este control web de terceros en particular requiere la arquitectura de WebForms, por lo que estoy buscando usar el mismo código de mi proyecto de WebForms.

Mi enfoque inicial debía tener dos sitios web (un sitio WebForms y un sitio MVC) y luego vincular los dos utilizando iFrames desde el lado MVC. Si bien sé que funcionaría, fue un poco exagerado usar este control en particular. Después de investigar más, descubrí que puedo " mezclar a los niños " y use la arquitectura de WebForms dentro de un proyecto MVC. Por lo tanto, el nuevo enfoque que he tomado es solo copiar las páginas que usan este control de terceros en un directorio específico (es decir, 'Ver \ SomeDir \ WebForms') y luego ignorar ese directorio en mi archivo global.asax para que el sistema de enrutamiento MVC no lo recoja:

routes.IgnoreRoute("View\SomeDir\WebForms\{*pathInfo}");

Desafortunadamente, cuando copié la página ASPX a mi proyecto MVC, descubrí que CodeBehind no me otorga acceso a mi control en la página. Así es como se configuran las cosas:

<%@ Register 
  Assembly="..." 
  Namespace="..." 
  TagPrefix="custom" %>

<custom:SomeControl ID="customControl" runat="server" />

Así es como se ve mi código:

public class MyPage : Page
{
  protected void Page_Load(object sender, EventArgs args)
  {
     Debug.WriteLine(customControl.ID); // <-- COMPILE ERROR: Cannot resolve symbol 'customControl'
  }
}

Desafortunadamente mi proyecto ni siquiera se compilará porque recibo este error en cada control en mi CodeBehind. No es un problema convertir los otros controles (es decir, etiquetas, paneles, cuadros de texto, etc.) a etiquetas de cliente, pero necesito tener acceso a este control personalizado en mi código para poder escucharlo (del lado del servidor ) eventos y responder en consecuencia; cosas básicas de WebForms ...

¿Es posible lo que intento hacer? Otro enfoque en el que pensé que el might funciona es inicializar y atrapar los eventos del lado del servidor en la clase de controlador. Sin embargo, me gustaría evitar serializar el estado del control en la vista, ¿simplemente pasarlo al controlador y viceversa si es posible?

Gracias de antemano por cualquier consejo!

¿Fue útil?

Solución

¡Santa mierda! Encontré la solución 10 minutos después de publicar esto.

La solución fue hacer clic derecho en mi proyecto y decir "Convertir a aplicación web". y cambiar mi clase CodeBehind de nuevo a un 'parcial'. Ahora se puede acceder a todos mis controles a través del código que se encuentra detrás.

Gracias por leer y espero que mi pregunta / respuesta ayude a alguien más algún día. :)

Otros consejos

No veo el punto de portar algo a MVC solo para mantener la mitad en WebForms tradicionales.

Este enfoque significará que cualquier desarrollador futuro necesitará estar familiarizado con ambas tecnologías y, en mi opinión, no está limpio.

Iría con uno u otro e intentaría evitar mezclar los dos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top