我在使用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类型的对象。 stringInstrumentItem_F14A58FE0974F90187F45D6 203769613D21C52F3672B47D240863DC806C87C17'输入 'System.Data.DataRowView'。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.InvalidCastException:无法转换对象 类型为'System.Data.Entity.DynamicProxies。
stringInstrumentItem_F14A58FE0974F90187F45D6203769613D21C52F3672B47D24086 3DC806C87C17'键入'System.Data.DataRowView'。来源错误:
第26行:{第27行:图片img = e.Item.FindControl(“brandImage”)as Image;第28行:
img.ImageUrl =“../Images/Guitar Brands / Guitar Items /”+
((DataRowView的)e.Item.DataItem强制转换).Row [ “itemimage1”];第29行:} 第30行:源文件:c:\ Users \ User1 \ Documents \ Visual Studio
2015 \ WebSites \ MusicStore \ Pages \ GuitarItemsFront.aspx.cs行:28堆栈追踪:
[InvalidCastException:无法转换类型为
的对象 “System.Data.Entity.DynamicProxies。 stringInstrumentItem_F14A58FE0974F90187F45D6203769613D21C52F 3672B47D240863DC806C87C17'输入'System.Data.DataRowView'。] Pages_GuitarItemsFront.repeater_ItemDataBound(对象发送者,
RepeaterItemEventArgs e)在c:\ Users \ User1 \ Documents \ Visual Studio中 2015年\网站已\ MusicStore \网页\ GuitarItemsFront.aspx.cs:28 System.Web.UI.WebControls.Repeater.OnItemDataBound(RepeaterItemEventArgs e)+111 System.Web.UI.WebControls.Repeater.CreateItem(Int32 itemIndex,ListItemType itemType,Boolean dataBind,Object dataItem) +138 System.Web.UI.WebControls.Repeater.AddDataItemsIntoItemsArray(IEnumerable dataSource,Boolean useDataSource)+217 System.Web.UI.WebControls.Repeater.PostGetDataAction(IEnumerable的
dataSource)+71 System.Web.UI.WebControls.Repeater.CreateControlHierarchy(布尔
useDataSource)+220 System.Web.UI.WebControls.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(布尔
includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint) 883
错误指向图像路径。我想知道如何在转发器中使用强类型数据控件使我的图像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是外键并引用表品牌的主键,也称为brandId):
的itemId brandId模型
1个1 XYZ
2 1 ABC
3 2 HJK
表品牌(其主键名为brandId,由表strinInstrumentItem引用):
brandId名称图像
1个伊瓦涅斯xyz.jpg
2挡泥板abc.jpg的
3吉布森hjk.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;
}
答案 0 :(得分:1)
您需要在查询中使用 包含 关键字。 例如,
List<stringInstrumentItem> name = obj.stringInstrumentItems
.Include(x => x.brand)
.Where(g => g.brand.name == guitarName && g.type == "Guitar")
.Select(g => g)
.ToList();
然后从标记中删除ImageUrl,并从后面的代码中分配它。
<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);
}
}
注意 :如果可能,文件夹名称中没有空格。