代码隐藏中的图片网址无法使用asp.net

时间:2017-07-20 12:37:36

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

1 个答案:

答案 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);
    }
}

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