2

我有一个如下列表集合:

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 :

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 始终为 null ,当我单击中继器内的每个链接按钮时!
我想获取中继器内每个链接按钮的文件路径!
我怎样才能做到这一点 ?

提前致谢

4

4 回答 4

2

e.Item.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
于 2011-10-11T21:35:26.053 回答
2

根据记忆(并从 Google 搜索中得到加强),ItemCommand是从ViewState. 一旦发生这种情况,您的原始DataItem引用将不再存在。

如果您想从该项目中检索值,尽管听起来很笨重,您需要将 HiddenField 添加到您的 Repeater ItemTemplate,如下所示:

<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);
于 2011-10-11T21:47:56.210 回答
1

我相信其他人会得到比我更好的答案,但我可以在您等待时提供解决方法。您可以添加一个包含 FileName 的隐藏字段,然后使用 e.Item.FindControl("HiddenFieldFileName") 获取该值。

于 2011-10-11T21:01:12.173 回答
0

大多数情况下不需要隐藏字段,只需将所需的数据值放在按钮的 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()

您可能需要对分配给 CommandArgument 的值进行 HTML 编码,以免破坏 HTML。

建议您不要将 CommandName 值设置为事件处理程序方法“lbFile_Click”的名称。而是使用名称来指示预期的结果或操作,在本例中为“导航”。

于 2013-06-24T17:54:33.520 回答