[英]asp.net GridView ImageField set DataImageUrlField result of linq join
我以这种方式构建了一个GridView:
<asp:GridView runat="server" ID="gridView" class="table table-striped table-bordered gvs" AutoGenerateColumns="false" OnRowDataBound="gridView_RowDataBound">
<Columns>
<asp:ImageField DataImageUrlField="a.ProfilePicture" HeaderText="Img"></asp:ImageField>
<asp:BoundField runat="server" HeaderText="Name" DataField="a.Name"/>
...
我以这种方式将数据加载到GridView中:
gridView.DataSource=GetData();
gridView.DataBind();
方法GetData
使用Linq返回一个List:
public static List<dynamic> GetData()
{
try
{
using (var context = new Entities())
{
var entities = (from a in context.Artist
join s in context.List_StatusType on a.Type equals s.Code
where s.Table == "Artist" && s.Field == "Type"
select new { a, Tipo = s.Value }).ToList<dynamic>();
return entities;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
当我转到页面时,应用程序给我一个DataBind
错误:
System.Web.HttpException:不可能的查找字段或属性“ a.ProfilePicture”
相反,如果我以这种方式绑定字段,那么所有字段都将完美运行。
<asp:GridView runat="server" ID="gridView" class="table table-striped table-bordered gvs" AutoGenerateColumns="false" OnRowDataBound="gridView_RowDataBound">
<Columns>
<asp:ImageField DataImageUrlField="Immagine" HeaderText="Img"></asp:ImageField>
<asp:BoundField runat="server" HeaderText="Name" DataField="a.Name"/>
...
public static List<dynamic> GetData()
{
try
{
using (var context = new Entities())
{
var entities = (from a in context.Artist
join s in context.List_StatusType on a.Type equals s.Code
where s.Table == "Artist" && s.Field == "Type"
select new { a, Immagine=a.ProfilePicture, Tipo = s.Value }).ToList<dynamic>();
return entities;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
这是什么问题 我该如何解决?
ImageField对嵌套属性的容忍度较低。 在第一个示例中,您要投影select new { a, Tipo = s.Value }
,这将在您的案例中使用一个名为Tipo
的属性创建一个匿名对象(动态),但至关重要的是,另一个名为a
属性是Artist
对象。具有自己的dynamic
。 因此,要访问a
,您需要说a.ProfilePicture
,而对于Imagine
,在第二个示例中,这是一个顶层属性,您可以将其投影为select new { a, Immagine=a.ProfilePicture, Tipo = s.Value }
。
您可以在顶层投影所需的所有属性,例如:var实体=(从context中的a.Artist加入s在context.List_StatusType上的a.Type等于s.Code,其中s.Table ==“ Artist” && s。字段==“类型”选择新的{a.ProfilePicture,a.Name,Tipo = s.Value})。ToList();
更好的方法是使用所需的属性创建一个视图模型,以使GridView消除歧义并返回该模型的集合而不是动态模型。
public class ArtistViewModel
{
public string ProfilePicture { get; set; }
public string Name { get; set; }
public string Tipo { get; set; }
// ... and so on
}
然后在您的GetData()方法中返回
var entities = (from a in context.Artist
join s in context.List_StatusType on a.Type equals s.Code
where s.Table == "Artist" && s.Field == "Type"
select new ArtistViewModel
{
ProfilePicture= a.ProfilePicture,
Name = a.Name,
Tipo = s.Value
}).ToList();
为什么不切换到TemplateField
。 它给您更多的控制权。 然后,您可以将完整列表绑定到GridView。
<asp:TemplateField HeaderText="Img">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Artist.ProfilePicture") %>' />
</ItemTemplate>
</asp:TemplateField>
请注意,Eval显示的是嵌套类本身的名称空间,而不是父类中属性的名称。
并且由于您正在使用List
,我建议您切换到强类型的GridView。 在这里查看我的答案: 如何列出从Aspx页面Web表单的表中检索的数据 。 然后,您可以访问所有属性,就像在后面的代码中那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.