我有一个列表集合,如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace FileExplorer.Classes
{
public class NewAddedFiles
{
public string FileName { get; set; }
public string FilePath { get; set; }
public DateTime FileCreationDate { get; set; }
}
}
private void GetFilesFromDirectory(string PhysicalPath)
{
DirectoryInfo Dir = new DirectoryInfo(PhysicalPath);
FileInfo[] FileList = Dir.GetFiles("*.*", SearchOption.AllDirectories);
List<NewAddedFiles> list = new List<NewAddedFiles>();
foreach (FileInfo FI in FileList)
{
NewAddedFiles NewAddedFile = new NewAddedFiles();
string AbsoluteFilePath = FI.FullName;
string RelativeFilePath = string RelativeFilePath = "~/" + (AbsoluteFilePath.Replace(Request.ServerVariables["APPL_PHYSICAL_PATH"], String.Empty)).Replace("\", "/");
NewAddedFile.FileName = FI.Name;
NewAddedFile.FilePath = RelativeFilePath;
NewAddedFile.FileCreationDate = FI.CreationTime;
list.Add(NewAddedFile);
}
Repeater1.DataSource = list;
Repeater1.DataBind();
}
我在aspx中的中继器如下所示:
<asp:Repeater ID="Repeater1" runat="server"
onitemcommand="Repeater1_ItemCommand">
<ItemTemplate>
<asp:Image ID="imgArrowIconInsideRepeater" runat="server" ImageUrl="~/Images/Login/ArrowIcon.png" />
<asp:LinkButton ID="lbFile" runat="server" CommandName="lbFile_Click" CssClass="lbFileInRepeater"><%# Eval("FileName")%></asp:LinkButton>
<br />
<asp:Label ID="lblFileCreationDate" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "FileCreationDate", "{0:yyyy/MM/dd - tt h:m:s}") %>'
CssClass="lblFileCreationDateInRepeater"></asp:Label>
<div class="EmptyDiv">
</div>
</ItemTemplate>
</asp:Repeater>
和Item_Command Of repeater后面的代码:
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
NewAddedFiles currentItem = (NewAddedFiles)e.Item.DataItem;
switch (e.CommandName)
{
case "lbFile_Click":
{
if (HttpContext.Current.Session["User_ID"] != null)
{
Response.Redirect("~/HandlerForRepeater.ashx?path=" + currentItem.FilePath);
}
else
{
ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('a');", true);
}
break;
}
default:
{
break;
}
}
}
}
我的问题是currentItem总是空的,当我点击每一个链接按钮里面的中继器!
我想得到每一个链接按钮在中继器内的FilePath !
我该怎么做呢?
thanks in advance
从内存中(并从Google搜索中得到强化),ItemCommand
是从ViewState
加载数据的事件之一。一旦发生这种情况,原始的DataItem
引用将不再存在。
如果您想从该项检索值,尽管听起来很笨拙,您需要在Repeater ItemTemplate中添加一个HiddenField,如下所示:
<asp:HiddenField ID="filePath" runat="server" Value='<%# DataBinder.Eval(Container.DataItem, "FilePath")' />
,然后替换这一行:
Response.Redirect("~/HandlerForRepeater.ashx?path=" + currentItem.FilePath);
用这两行:
HiddenField filePath = (HiddenField) e.Item.FindControl("filePath");
Response.Redirect("~/HandlerForRepeater.ashx?path=" + filePath.Value);
DataItem仅在数据绑定事件期间可用。您将需要使用另一种方法提取所需的信息。将主键放入隐藏字段,检索该值,然后
试试
RepeaterItem ri = e.Item;
HiddenField pk = (HiddenField)ri.FindControl("pk");
int FileID = Convert.ToInt32(pk.Value);
// Create a NewAddedFiles object using the File's FileID (or whatever you have) and get the Filepath from that
我相信别人会有比我更好的答案,但我可以在你等待的时候提供一个变通方法。您可以添加一个包含FileName的隐藏字段,然后使用e.Item.FindControl("HiddenFieldFileName")来获取值
在大多数情况下,不需要隐藏字段,只需将所需的数据值放在按钮的CommandArgument属性中:
<asp:LinkButton ID="lbFile" runat="server" CommandName="lbFile_Click" CommandArgument='<%# Eval("FilePath")%>' CssClass="lbFileInRepeater"><%# Eval("FileName")%></asp:LinkButton>
然后在ItemCommand()事件中检索值:
string filePath = e.CommandArgument.ToString()
你可能需要对分配给commanddocument的值进行HTML编码,这样它就不会破坏HTML。
建议不要将CommandName值设置为事件处理程序方法"lbFile_Click"的名称。相反,使用名称来指示预期的结果或操作,在本例中为"导航"。