C# 代码隐藏中的图像url无法使用asp.net工作
我在使用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
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);
}
}