C# 代码隐藏中的图像url无法使用asp.net工作

C# 代码隐藏中的图像url无法使用asp.net工作,c#,asp.net,sql-server,database,C#,Asp.net,Sql Server,Database,我在使用asp.net在网站中显示图像时遇到问题。最初,当我还没有在中继器中集成强类型数据控件时,我已经成功地完成了这一切。以下是之前的代码: public void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e) { Image img = e.Item.FindControl("brandImage") as Image; img.ImageUrl = "../Images/Guitar Brand

我在使用asp.net在网站中显示图像时遇到问题。最初,当我还没有在中继器中集成强类型数据控件时,我已经成功地完成了这一切。以下是之前的代码:

public void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Image img = e.Item.FindControl("brandImage") as Image;
    img.ImageUrl = "../Images/Guitar Brands/Guitar Items/" + 
      ((DataRowView)e.Item.DataItem).Row["itemimage1"];
}
当我还在使用数据集时,上面的代码可以完美地工作。但当我开始使用强类型转发器时,它给了我以下服务器错误:

无法强制转换“System.Data.Entity.DynamicProxies”类型的对象。 StringInstruments项目_F14A58FE0974F90187F45D6 203769613D21C52F3672B47D240863DC806C87C17'至类型 “System.Data.DataRowView”

描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源

异常详细信息:System.InvalidCastException:无法强制转换对象 类型为“System.Data.Entity.DynamicProxies”。
StringInstruments项目_f14A58FE0974F90187F45D620379613D21C52F3672B47D24086 3DC806C87C17'输入'System.Data.DataRowView'

源错误:

第26行:{27行:图像img= e、 Item.FindControl(“brandImage”)作为图像;第28行:
img.ImageUrl=“../Images/吉他品牌/吉他项目/”+
((DataRowView)e.Item.DataItem)。行[“itemimage1”];第29行:}
第30行:

源文件:c:\Users\User1\Documents\Visual Studio
2015\WebSites\MusicStore\Pages\GuitarItemsFront.aspx.cs行:28

堆栈跟踪:

[InvalidCastException:无法强制转换类型为的对象
'System.Data.Entity.DynamicProxies。 StringInstruments项目_F14A58FE0974F90187F45D620379613D21C52F 3672B47D240863DC806C87C17'输入'System.Data.DataRowView' Pages\u GuitarItemsFront.repeater\u ItemDataBound(对象发送方,
c:\Users\User1\Documents\Visual Studio中的RepeaterItemEventTargets)文件
2015\WebSites\MusicStore\Pages\GuitarItemsFront.aspx.cs:28 System.Web.UI.WebControl.Repeater.OnItemDataBound(RepeaterItemEventArgs e) +111 System.Web.UI.WebControls.Repeater.CreateItem(Int32 itemIndex、ListItemType、itemType、Boolean数据绑定、对象数据项) +138 System.Web.UI.WebControl.Repeater.AddDataItemsIntoItemsArray(IEnumerable 数据源,布尔值useDataSource)+217 System.Web.UI.WebControl.Repeater.PostGetDataAction(IEnumerable
数据源)+71 System.Web.UI.WebControl.Repeater.CreateControlHierarchy(布尔值
useDataSource)+220 System.Web.UI.WebControl.Repeater.OnDataBinding(EventArgs e)+62 System.Web.UI.WebControls.Repeater.DataBind()+77 System.Web.UI.WebControls.Repeater.EnsureDataBound()+58 System.Web.UI.WebControls.Repeater.OnPreRender(EventArgs e)+15 System.Web.UI.Control.PreRenderRecursiveInternal()+88 System.Web.UI.Control.PreRenderRecursiveInternal()+160 System.Web.UI.Control.PreRenderRecursiveInternal()+160 System.Web.UI.Control.PreRenderRecursiveInternal()+160 System.Web.UI.Control.PreRenderRecursiveInternal()+160 System.Web.UI.Page.ProcessRequestMain(布尔值
IncludeStages前同步点,布尔值IncludeStages后同步点) +883

错误指向图像路径。我想知道如何使用repeater中的强类型数据控件使我的图像url再次工作。我还将包括aspx文件的代码

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="repeater_ItemDataBound" ItemType="stringInstrumentItem" SelectMethod="GetItemData">
    <ItemTemplate>
        <div class="one-two">
            <asp:LinkButton ID="linkButton" OnClick="Repeater1_OnClick" runat="server" CommandArgument='<%# Item.brandId + ";" + Item.model %>'>
                 <asp:Image ID="brandImage" runat="server" ImageUrl='<%# Item.itemimage1 %>' height="130px" width="350px" />
             </asp:LinkButton>
            <div class="content">
                <div id="label"><%# Item.brand.name %> <%# Item.model %></div>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>

另外,为了了解我的数据库是什么,以下是表:

表stringInstrumentItem(列brandId为外键,引用表brand的主键,也称为brandId):


itemibrandidmodel
11xyz
21abc
32hjk

表brand(其主键名为brandId,由表strinInstrumentItem引用):


brandIdnameimage
1ibanezyz.jpg
2Fenderabc.jpg
3Gibsonhjk.jpg

下面是GetItemData方法的代码:

public List<stringInstrumentItem> GetItemData()
{
    MusicStoreDBEntities obj = new MusicStoreDBEntities();
    List<stringInstrumentItem> name = new List<stringInstrumentItem>();
    name = (from g in obj.stringInstrumentItems where g.brand.name == guitarName && g.type == "Guitar" select g).ToList();
    return name;
}
公共列表GetItemData()
{
MusicStoreDBEntities obj=新的MusicStoreDBEntities();
列表名称=新列表();
name=(从obj.stringInstrumentItems中的g开始,其中g.brand.name==guitarName&&g.type==“吉他”选择g.ToList();
返回名称;
}

您需要在查询中使用Include关键字。比如说,


注意:如果可能,文件夹名称中不要有空格

e.Item.DataItem
的类型是什么?这与图像无关
e.Item.DataItem
不是一个
DataRowView
,它是一个名为
stringInstrumentItem
(由entity Framework为延迟加载而分类)的实体类型,如错误所示。转换为该类型。如何将数据分配给数据源?您还可以给我们看一下查询吗?@Win-我已经在问题的末尾添加了代码。将
中的
DataRowView
替换为
((DataRowView)e.Item.DataItem)
,使用
stringInstrumentItem
…嗯…实际上查询正在运行。我已经通过将图像url中的强制转换从DataRowView更改为stringInstrumentItem解决了这个问题。但我对您的方法感兴趣,这也会起作用。通常,我们使用Include关键字显式加载关系表。EF有时在自动为我们拉表方面做得很好,但情况并非总是如此。我明白了。伟大的洞察力。
List<stringInstrumentItem> name = obj.stringInstrumentItems
        .Include(x => x.brand)
        .Where(g => g.brand.name == guitarName && g.type == "Guitar")
        .Select(g => g)
        .ToList();
<asp:Image ID="brandImage" runat="server" height="130px" width="350px" />
protected void repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        var stringInstrumentItem = e.Item.DataItem as stringInstrumentItem;

        Image img = e.Item.FindControl("brandImage") as Image;
        img.ImageUrl = string.Format("~/Images/Guitar Brands/Guitar Items/{0}", stringInstrumentItem.brand.image);
    }
}