1

我认为这是直截了当的,但我有一个链接按钮,我在点击事件中这样做:

myContainer.Controls.Add( new FileUpload());

我希望每次单击都会在容器中生成 1 个新的文件控件上传,但是,我总是得到 1 个。我需要做什么才能拥有多个文件上传控件?

4

2 回答 2

2

由于控件是动态添加的,因此它无法在回发后继续存在。这意味着您必须在 preinit 事件中再次添加文件上传(或任何其他动态添加的控件),以便能够填充其值并稍后在页面生命周期中使用它。

听起来您正在尝试能够上传多个文件。您可能希望使用 jQuery 添加文件上传并使用 Request.Files 属性将它们放在后端。

于 2011-09-30T20:23:22.077 回答
1

我同意 Becuzz 的回答。试试这个,有更好的方法可以做到这一点,但这也可能有所帮助:

将此添加到页面的“加载”事件中

if (!IsPostBack) {
    Session["UploadControls"] = null;
}

if (Session["UploadControls"] != null) {
    if (((List<Control>)Session["UploadControls"]).Count > 0) {
        foreach ( ctrl in (List<Control>)Session["UploadControls"]) {
            files.Controls.Add(ctrl);
        }
    }
}

并将其添加到页面的 PreInit 部分:

string ButtonID = Request.Form("__EVENTTARGET");
if (ButtonID == "Button1") {
    FileUpload NewlyAdded = new FileUpload();

    List<Control> allControls = new List<Control>();

    if (Session["UploadControls"] != null) {
        if (((List<Control>)Session["UploadControls"]).Count > 0) {
            foreach ( ctrl in (List<Control>)Session["UploadControls"]) {
                allControls.Add(ctrl);
                //Add existing controls
            }
        }
    }

    if (!allControls.Contains(NewlyAdded)) {
        allControls.Add(NewlyAdded);
    }

    Session["UploadControls"] = allControls;
}

并将其添加到您的 HTML 中。这当然可以是任何东西:

<div id="files" runat="server">

</div>

我使用“__EVENTTARGET”值来了解导致回发的原因,这样您就不会得到不需要的上传控件。

祝你好运,希望这会有所帮助。

汉莱特

于 2011-09-30T21:23:01.100 回答