2011-01-13 4 views
6

Estoy creando una variable miembro de lista durante mi evento Page_Init. Tengo un problema al hacer referencia a los objetos en la lista de mi código incrustado de C# en la página * .aspx. El error es una Excepción de encuadernación en tiempo de ejecución que dice que "'objeto' no contiene una definición para 'ID de trabajo'".No se pueden hacer referencia a objetos dinámicos en el código ASPX incorporado

Cuando se invoca el depurador, puedo ver que la variable j del bucle foreach sí tiene una propiedad dinámica llamada ID de tarea y está llena de un valor int. Entonces, mi pregunta es por qué mi código de C# incrustado no puede funcionar con el objeto dinámico. ¿Existe una declaración <% @ Import%> que deba trabajar con objetos dinámicos? Intenté agregar <% @ Import namespace = "System.Dynamic"%> pero eso no ayudó.

Gracias por la ayuda. Marcos

código subyacente:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using Jobbarama.WebCode; 
    using DataModel; 


    public partial class contact : System.Web.UI.Page 
    { 
     public List<dynamic> JobList { get; set; } 

     protected void Page_Init(object sender, EventArgs e) 
     { 
      SessionManager mgr = SessionManager.Current; 

       using (myEntities context = new myEntities()) 
       { 
        var qry = from c in context.vjobList 
         where c.CampaignID == mgr.CampaignID 
         select new 
         { 
             c.JobID, c.JobTitle, c.CompanyName, c.InterestDate, c.InterestLevel 
         }; 

        JobList = qry.ToList<dynamic>(); 
       } 
      } 

     } 
    } 

Código ASPX:

<select id='cboJob' name='cboJob' style='width: 150px;'> 
    <%foreach (var j in JobList){ %> 
     <option value="<%=j.JobID %>"><%=j.JobTitle%> [<%=j.CompanyName%>]</option> 
    <%} %> 
</select> 
+0

Estoy teniendo la misma dificultad con el código incrustado donde mi código subyacente devuelve un IEnumerable . Parece que en alguna parte mi dinámica se está convirtiendo en un objeto o algo. @sisdog, incluso si modifica su foreach para que parezca <% foreach (dynamic j en JobList)%>, parece que no funciona. – kd7iwp

+0

Si bien no es una respuesta a por qué no está funcionando, puede volver a escribir su código para usar DataBinder.Eval que recurriría a la utilización de la reflexión para tomar la propiedad JobID. – Tony

Respuesta

1

Mi conjetura esto podría ser un problema de permisos debido al uso de una clase anónima y aspx cosas finales compilación de diferentes ensambles.

Puede usar impromptu-interface para hacer esto.

using ImpromptuInterface 

entonces se crea un interfaz (estoy usando dinámica, porque no sé sus tipos)

interface ISelectJob 
dynamic JobID 
dynamic JobTitle 
dynamic CompanyName 
dynamic InterestDate 
dynamic InterestLevel 
} 

su propiedad debe utilizar la interfaz

public List<ISelectJob> JobList { get; set; } 

Y para crear su lista solo agrega .AllActLike<ISelectJob>()

JobList = qry.AllActLike<ISelectJob>().ToList(); 

Y esto debería funcionar, ya que genera un proxy dlr liviano y establece el contexto para la clase anónima en sí misma, por lo que cree que siempre tiene acceso, a diferencia de llamar con la palabra clave dinámica.

+0

Impresionante, pero no pude hacer que funcione. Me sale este error: 'LINQ to Entities no reconoce el método 'test.ISelectJob ActLike [ISelectJob] (System.Object, System.Type [])' método, y este método no se puede traducir a una expresión de tienda' ¿Tiene sentido para usted? – sisdog

+0

Sí, mi error no fue IQueryable, puedo arreglar el ejemplo. – jbtule

+0

Hecho. Creo que también se lee mucho más claro. Aunque no tiene que hacer que JobList tenga el tipo estático, si había una razón por la que tenía que ser 'List ', entonces la última línea podría ser 'JobList = qry.AllActLike (). ToList (); 'de todos modos. – jbtule

1

¿Qué hay de usar un LinqDataSource, establecer el comando OnSelecting y usar un repetidor o datalist para mostrar?

Cuestiones relacionadas