C# asp.net GridView ImageField设置linq联接的DataImageUrlField结果
我以这种方式构建了一个GridView:C# asp.net GridView ImageField设置linq联接的DataImageUrlField结果,c#,asp.net,linq,gridview,C#,Asp.net,Linq,Gridview,我以这种方式构建了一个GridView: <asp:GridView runat="server" ID="gridView" class="table table-striped table-bordered gvs" AutoGenerateColumns="false" OnRowDataBound="gridView_RowDataBound"> <Columns> <asp:ImageField Dat
<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.DataSource=GetData();
gridView.DataBind();
方法GetData
使用Linq返回一个列表:
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;
}
}
这是什么问题?如何修复它?ImageField对嵌套属性的容忍度较低。在第一个示例中,您使用
select new{a,Tipo=s.Value}
进行投影,在您的示例中,它使用名为Tipo
的属性创建一个匿名对象(动态),但至关重要的是,另一个名为a
的属性是Artist
对象,在dynamic
中具有自己的属性。因此,要访问a
,您需要说a.ProfilePicture
,而对于Imagine
,在第二个示例中,这是一个顶级属性,您将其投影为选择新的{a,Immagine=a.ProfilePicture,Tipo=s.Value}
您可以在顶层投影所需的所有属性,如:
var entities=(来自context.Artist中的
在context.List_StatusType中连接s。类型等于s.代码
其中s.表==“艺术家”和s.字段==“类型”
选择新的
{
a、 简介图片,
a、 名字,
Tipo=s.值
}).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();
ImageField对嵌套属性的容忍度较低。在第一个示例中,您使用
select new{a,Tipo=s.Value}
进行投影,在您的示例中,它使用名为Tipo
的属性创建一个匿名对象(动态),但至关重要的是,另一个名为a
的属性是Artist
对象,在dynamic
中具有自己的属性。因此,要访问a
,您需要说a.ProfilePicture
,而对于Imagine
,在第二个示例中,这是一个顶级属性,您将其投影为选择新的{a,Immagine=a.ProfilePicture,Tipo=s.Value}
您可以在顶层投影所需的所有属性,如:
var entities=(来自context.Artist中的
在context.List_StatusType中连接s。类型等于s.代码
其中s.表==“艺术家”和s.字段==“类型”
选择新的
{
a、 简介图片,
a、 名字,
Tipo=s.值
}).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();
为什么不切换到
模板字段
。它给你更多的控制。然后可以将完整列表绑定到GridView
<asp:TemplateField HeaderText="Img">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Artist.ProfilePicture") %>' />
</ItemTemplate>
</asp:TemplateField>
。然后,您就可以像在代码隐藏中一样访问所有属性。为什么不切换到TemplateField
。它给你更多的控制。然后可以将完整列表绑定到GridView
<asp:TemplateField HeaderText="Img">
<ItemTemplate>
<asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Artist.ProfilePicture") %>' />
</ItemTemplate>
</asp:TemplateField>
。然后,您可以像在代码隐藏中一样访问所有属性