2009-05-21 19 views
5

Tengo un control de usuario que contiene asp: Literal.asp: Control literal nulo en el control de usuario

<div> 
    <asp:Literal id="MenuContainer" runat="server" /> 
</div> 

Hay un método en el código subyacente que inicializa el control:

internal void Setup(MyBusinessObject obj) 
{ 
    MenuObject menu = MenuHelper.GetMenu(obj.State); 

    if(obj == null) 
     MenuContainer.Visible = false; 

    //other code 
} 

En la página donde se utiliza el control llamo Configuración método de control de LoadComplete manejador evento (Lo estaba llamando por primera vez en Cargar evento). Independientemente de MyBusinessObject ser nulo o no nulo, cuando accedo a literal en el control de usuario me sale error:

Object reference not set to an instance of an object. 

¿Cuál es la razón y cuál es el remedio para esto?

+0

ESTÁ funcionando bien para mí aunque. Puede haber algún otro problema. Intenta compilar todo el sitio web. Y, por cierto, ¿puede acceder a otros controles en ese control de usuario correctamente? – Kirtan

+0

En realidad este es el único control en el usuario-contorl – TheVillageIdiot

Respuesta

11

Se fue muy simple Estaba agregando cosas en la sección de controles de web.config como fue sugerido por Rick Sthral en una de sus publicaciones (:(para obtener acerca de la publicación, tendrá que buscar en su página).

Me fue muy bien permitirme agregar controles sin poner @ Register etiqueta, pero la desventaja es que los controles secundarios en mis controles se muestran como nulos!así que simplemente puse @ Register directiva en mis páginas y funcionó.

+0

+1, gracias! ¿Alguien puede explicar esta absurda solución? ¿No se supone que el atajo web.config elimina la necesidad de ensuciar el marcado de la página con las directivas Register? ¿Por qué molestarse si tenemos que ponerlo allí de todos modos para evitar errores extraños y que te arrancan el pelo como este? De acuerdo,. –

+0

@Yadyn eso es lo que no puedo entender. He puesto comentarios en el blog de Rick pero no he recibido ninguna respuesta. – TheVillageIdiot

0

¿Está seguro de que MenuContainer es el problema? Está haciendo referencia a obj.State en la primera línea de la función Setup. Si ese obj es nulo, obtendrá ese error.

+0

Sí, es el problema. if (obj == null) pasa. MenuContainer.Visible lanza una excepción. – TheVillageIdiot

0

Como se menciona en la respuesta por JerSchneid, si obj es nulo, obtendrá ese error. Por lo tanto, trate de hacerlo así -

internal void Setup(MyBusinessObject obj) 
{ 
    if(obj == null) 
     MenuContainer.Visible = false; 
    else 
     MenuObject menu = MenuHelper.GetMenu(obj.State); 
} 

EDIT: Yo sé que está recibiendo un error en esa línea, pero sólo trata de hacerlo de esta manera. O bien, elimine todo el código y simplemente mantenga la línea MenuContainer.Visible = false;.

+0

Estimado que el obj no es nulo, solo el MenuContainer es nulo. Es por eso que estoy desconcertado. – TheVillageIdiot

0

Si MenuContainer es nulo, probablemente tenga algo que ver con la línea de tiempo del ciclo de vida de la página. Está llamando a esa función antes de conectar el MenuContainer. ¿Puedes intentar llamar al Setup en la función Page_Load?

0

El código que envió es el siguiente:

internal void Setup(MyBusinessObject obj) 
{  
    MenuObject menu = MenuHelper.GetMenu(obj.State);  

    if(obj == null)   
     MenuContainer.Visible = false; //other code 
} 
  • Si obj es nulo, eliminación de referencias obj.State en la primera línea arrojará un NullReferenceException

  • Si obj no es nulo , la línea MenuContainer.Visible = false no se ejecutará.

Así que no creo que esté publicando todo el código relevante.

Cuando usted está teniendo dificultades para la depuración de este tipo de cosas, tratar de recorrer el código con el depurador o la adición de algunos afirma que su código, que le ayudará a ver exactamente lo que está sucediendo:

internal void Setup(MyBusinessObject obj) 
{  
    Debug.Assert(obj != null); 
    MenuObject menu = MenuHelper.GetMenu(obj.State);  

    Debug.Assert(MenuContainer != null); 
    if(obj == null)   
     MenuContainer.Visible = false; //other code 
} 
1

Gracias, TheVillageIdiot, por publicar la respuesta a su problema. Encontré exactamente el mismo malentendido.

Agregar controles a través de

<add tagPrefix="user" namespace="Frontend.Web.UserControlsAccount" assembly="Frontend.Web" /> 

en el web.config no fue suficiente hacer uso de ella! Lo probé como este en una página:

<user:ucLoginMessages runat="server" ID="Msgs" /> 

... pero esto llevaría al fenómeno, que ninguno de los controles dentro de la control de usuario se inicializa. Sólo añadiendo

<%@ Register Src="~/UserControlsAccount/LoginMessages.ascx" TagPrefix="user" TagName="Messages" %> 

a la parte superior de la página resuelto el problema :-)

Gracias de nuevo!

5

Depende de exactamente cómo está incluyendo los controles en su web.config. No funcionará si intenta incluir todos los controles en un espacio de nombres (aunque el diseñador correctamente, se mostrará la lista de sus controles):

<add tagPrefix="prefix" namespace="example.ui.controls" assembly="example.ui" /> 

Pero si añadir su control (s) de forma individual y punto a sus ubicaciones físicas, funcionará como espera sin tener que incluir interminables directivas @Register.

<add tagPrefix="prefix" tagName="Message" src="~/Controls/Message.ascx" /> 
Cuestiones relacionadas