Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# asp.net GridView ImageField设置linq联接的DataImageUrlField结果_C#_Asp.net_Linq_Gridview - Fatal编程技术网

C# asp.net GridView ImageField设置linq联接的DataImageUrlField结果

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

我以这种方式构建了一个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.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>
。然后,您可以像在代码隐藏中一样访问所有属性