asp.net GridView ImageField设置linq join的DataImageUrlField结果

时间:2017-08-21 10:44:32

标签: 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 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;
        }
    }

这有什么问题?我该如何解决?

2 个答案:

答案 0 :(得分:0)

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 entities =(来自上下文。艺术家         在上下文中连接s。在a.Type上的List_StatusType等于s.Code         其中s.Table ==&#34;艺术家&#34; &安培;&安培; s.Field ==&#34;输入&#34;         选择新的         {             a.ProfilePicture,             一个名字,             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();

答案 1 :(得分:0)

为什么不切换到TemplateField。它为您提供更多控制。然后,您可以将完整列表绑定到GridView。

<asp:TemplateField HeaderText="Img">
    <ItemTemplate>
        <asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("Artist.ProfilePicture") %>' />
    </ItemTemplate>
</asp:TemplateField>

请注意,Eval显示嵌套类本身的名称空间,而不是父类中属性的名称。

由于你正在使用List,我建议切换到强类型的GridView。请在此处查看我的回答:How to list data retrieved from a table in Aspx page web form。然后,您可以像在后面的代码中那样访问所有属性。