Asp.net mvc 为什么在中继器中从不同的图像视图获得相同的图像id?
我有一个转发器,可以在幻灯片中显示文件夹中的图像,这样当您单击幻灯片中的当前图像时,就会打开一个产品页面,其中显示所选图像的详细信息。 同时,我有一个productModel,它列出了数据库中的所有图像,这样当您单击任何图像时,它就会打开图像产品页面,如上所述。 现在,我担心的是,我附加到转发器上的超链接会不断从转发器上显示的不同图像打开相同的产品页面。谁能帮我指出我做错了什么?我将非常感激Asp.net mvc 为什么在中继器中从不同的图像视图获得相同的图像id?,asp.net-mvc,repeater,Asp.net Mvc,Repeater,我有一个转发器,可以在幻灯片中显示文件夹中的图像,这样当您单击幻灯片中的当前图像时,就会打开一个产品页面,其中显示所选图像的详细信息。 同时,我有一个productModel,它列出了数据库中的所有图像,这样当您单击任何图像时,它就会打开图像产品页面,如上所述。 现在,我担心的是,我附加到转发器上的超链接会不断从转发器上显示的不同图像打开相同的产品页面。谁能帮我指出我做错了什么?我将非常感激 <ul class="bjqs"> <asp:Repeater ID="Repeate
<ul class="bjqs">
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate><li>
<asp:HyperLink ID="link" runat="server">
<img src='<%# DataBinder.Eval(Container.DataItem,"Value") %>'
title='<%# (DataBinder.Eval(Container.DataItem,"Text").ToString()).Split('.')[0].ToString() %>' alt="">
</asp:HyperLink></li>
</ItemTemplate>
</asp:Repeater>
</ul>
-
'
title=''alt=”“>
服务器端代码:
protected void Page_Load(object sender, EventArgs e)
{
FillPage();
string[] filePaths = Directory.GetFiles(Server.MapPath("~/pages/Management/Images/Products/"));
List<ListItem> files = new List<ListItem>();
foreach (string filePath in filePaths)
{
string fileName = Path.GetFileName(filePath);
files.Add(new ListItem(fileName, "/pages/Management/Images/Products/" + fileName));
}
Repeater1.DataSource = files;
Repeater1.DataBind();
}
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
ProductModel productModel = new ProductModel();
List<Product> products = productModel.GetAllProducts();
foreach (Product product in products)
{
Panel productPanel = new Panel();
HyperLink hp = (HyperLink)e.Item.FindControl("link");
hp.NavigateUrl = "~/pages/Product.aspx?id=" + product.ID;
}
}
受保护的无效页面加载(对象发送方,事件参数e)
{
FillPage();
string[]filepath=Directory.GetFiles(Server.MapPath(“~/pages/Management/Images/Products/”);
列表文件=新列表();
foreach(文件路径中的字符串文件路径)
{
字符串fileName=Path.GetFileName(filePath);
添加(新列表项(文件名,“/pages/Management/Images/Products/”+fileName));
}
Repeater1.DataSource=文件;
Repeater1.DataBind();
}
}
受保护的void Repeater1\u ItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
ProductModel ProductModel=新的ProductModel();
List products=productModel.GetAllProducts();
foreach(产品中的产品)
{
Panel productPanel=新面板();
HyperLink hp=(HyperLink)e.Item.FindControl(“链接”);
hp.NavigateUrl=“~/pages/Product.aspx?id=“+Product.id;
}
}
中继器中的每个项目都有相同链接的原因是,当您将项目绑定到中继器时,每个项目都会运行ItemDataBound事件。在该事件中,您循环遍历每个产品项,并在foreach循环中反复覆盖超链接NavigateURL,直到列表中的最后一个产品是超链接的剩余值
如果设置断点并单步执行ItemDataBound事件,您将看到此行为
我无法告诉您如何修复它,因为我根本看不到您打算如何将文件映射到产品。一旦你这样做了,我建议将你的转发器绑定到产品列表,并在你的产品模型中添加一个公共属性,它将保存你想要显示的图像的文件位置。然后可以在ItemDataBound事件或aspx标记中设置,就像您现在使用src这样做一样
有关ItemDataBoundEvent的一些信息,包括如何获取基础数据项
受保护的无效页面\u加载(对象发送方,事件参数e)
{
FillPage();
如果(!IsPostBack)
{
GetData(null,null,null,null);
}
DbRetrival();
}
受保护的void Repeater1\u ItemDataBound(对象发送方,RepeaterItemEventArgs e)
{
string ID=DataBinder.Eval(例如Item.DataItem,“ID”).ToString();
HyperLink hp=(HyperLink)e.Item.FindControl(“链接”);
hp.NavigateUrl=“~/pages/Product.aspx?id=“+id;
}
私有void DbRetrival()
{
字符串cs=ConfigurationManager.ConnectionString[“SuperstoredConnectionString”]。ConnectionString;
SqlConnection con=新的SqlConnection(cs);
DataTable dt=新的DataTable();
SqlDataAdapter adp=新的SqlDataAdapter(“从产品中选择ID、图像、名称”,con);
自动进料(dt);
Repeater1.DataSource=dt;
Repeater1.DataBind();
}
私有void folderretrieval()
{
string[]filepath=Directory.GetFiles(Server.MapPath(“~/pages/Management/Images/Products/”);
列表文件=新列表();
foreach(文件路径中的字符串文件路径)
{
字符串fileName=Path.GetFileName(filePath);
添加(新列表项(文件名,“/pages/Management/Images/Products/”+fileName));
}
Repeater1.DataSource=文件;
Repeater1.DataBind();
}
asp页面:
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<li>
<asp:HyperLink ID="link" runat="server">
<br /> <asp:Image runat="server" ImageUrl='<%#"~/pages/Management/Images/Products/" + String.Format("{0}",
Eval("Image")) %>' Width='180px' Height='145px' /> </Image>
<br /> <%# Eval("Name")%>
</asp:HyperLink>
</li>
</ItemTemplate>
为什么您会得到一个新的产品列表,并在ItemDatabound事件中循环使用它们?我不确定你在做什么,但粗略地看一下,似乎存在对ItemDataBound事件的根本性误用。你能确定我哪里出错了吗?我帮不了你太多,因为我真的不知道你想做什么。ItemDataBound事件将为文件列表中的每个项目(无论您绑定到什么)触发。您可以访问RepeaterItemEventArgs e中的每个项目,从中获取所需内容。显然,您绑定到的只是一个具有文件名的字符串对象。也许您想绑定到产品列表,然后将每个产品附加到一个文件?真的,这取决于你。希望了解repeater和ItemDataBound事件将有助于您了解您希望做得更好的内容。您的分析很有见地,也很有帮助,Adam,实际上数据库中的每个产品都复制到一个目录中,正如您正确地指出的,我希望绑定到产品列表。问题是,我不知道我所做的是不是可以实现的,因为我使用的是转发器文件夹中的图像,我希望这些图像中的每一个都能打开一个使用productModel从db创建的产品页面。单击时。我为我的天真感到抱歉,我不是转发器的专业人士。我已经移除了foreach,这很有帮助。但是,当单击任何当前图像时,我总是得到相同的url,而没有传递任何产品id值“”你能告诉我如何使用if语句从文件夹中找到与我所在行匹配的正确产品吗?谢谢你Adam,至少你让我意识到将文件映射到产品很困难,这让我别无选择,只能寻找其他替代方案来实现我的目标。如果不使用文件系统方法,是否可以创建sl
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<li>
<asp:HyperLink ID="link" runat="server">
<br /> <asp:Image runat="server" ImageUrl='<%#"~/pages/Management/Images/Products/" + String.Format("{0}",
Eval("Image")) %>' Width='180px' Height='145px' /> </Image>
<br /> <%# Eval("Name")%>
</asp:HyperLink>
</li>
</ItemTemplate>