c# - GridView enlazado con Propiedades de la clase anidada
asp.net objectdatasource (2)
Tengo un mapa de objeto similar a lo que se detalla a continuación. Cuando intento vincular las propiedades de NestedClass en un GridView obtengo el error:
"Un campo o propiedad con el nombre ''NestedClass.Name'' no se encontró en la fuente de datos seleccionada."
GridView está vinculado a ObjectDataSource y ObjectDataSource está vinculado a una instancia completamente poblada de BoundClass.
¿Hay alguna forma de evitar esto?
Clases de muestra:
public class BoundClass
{
public string Name { get; set; }
public NestedClass NestedClass { get; set; }
}
public class NestedClass
{
public string Name { get; set; }
}
Esta extensión en BoundField llama a DataBinder.Eval()
, que admite propiedades anidadas:
public class BetterBoundField : BoundField
{
protected override object GetValue(Control controlContainer)
{
if (DataField.Contains("."))
{
var component = DataBinder.GetDataItem(controlContainer);
return DataBinder.Eval(component, DataField);
}
return base.GetValue(controlContainer);
}
}
Solo las propiedades inmediatas de una instancia se pueden mostrar en una columna de BoundField.
En su lugar, debe usar DataBinder.Eval en una plantilla de elemento para acceder a la propiedad anidada en lugar de asignarla a un límite.
Ejemplo:
<asp:TemplateField>
<itemtemplate>
<p><%#DataBinder.Eval(Container.DataItem, "NestedClass.Name")%></p>
</itemtemplate>
</asp:TemplateField>
Alternativamente, puede crear una clase personalizada que herede BoundField y anule GetValue para usar DataBinder.Eval, como se describe en esta publicación del blog: