【问题标题】:Iterating Dynamic FileUpload Control Collection in Panel Control using ASP.NET C#使用 ASP.NET C# 在面板控件中迭代动态 FileUpload 控件集合
【发布时间】:2011-04-25 23:11:21
【问题描述】:

我正在尝试获取添加到面板的动态生成的 FileUpload 控件的值:

<asp:Panel ID="pFileControls" runat="server">
</asp:Panel>

我在通过记录集的循环期间创建控件:

foreach(DataRow dr in ds.Tables[0].Rows)
{
    FileUpload fu = new FileUpload();
    fu.ID = dr["SomeID"].ToString();

    pFileControls.Controls.Add(fu);
}

在我使用此按钮提交表单之前,一切正常:

<asp:Button ID="btnImportFile" runat="server" Text="Save" OnClick="btnImportFile_Click" />

我是这样注册的(Page_Load):

ScriptManager.GetCurrent(this).RegisterPostBackControl(btnImportFile);

我这样做是因为我在我的网站中使用了 MasterPage/ContentPage 设置,并且大多数事情都发生在 UpdatePanel 中以用于 AJAX 化。请记住,如果我在 HTML 视图中明确指定 FileUpload 控件,它会 100% 工作。

提交表单后,我尝试像这样迭代面板:

foreach (Control ctrl in pFileControls.Controls)
{
    if (ctrl.GetType() != typeof(FileUpload))
    {
        continue;
    }

    //Do the saving of the file here
}

除了,面板似乎只返回一个控件:页面的内容占位符,没有别的。有人对此有什么想法吗?

【问题讨论】:

    标签: c# asp.net file-upload panel dynamic-controls


    【解决方案1】:

    您在生命周期的哪个部分添加动态控件?

    如果您将它们放在 page_load 中可能为时已晚,请尝试将动态控件的生成放入 page_init 中,看看是否可以解决问题。

    页面生命周期 http://msdn.microsoft.com/en-us/library/ms178472.aspx

    动态控制 http://geekswithblogs.net/shahed/archive/2008/06/26/123391.aspx 注意:

    "建议加载动态 而是在 Page_Init 期间进行控制, 因为我们可能想把我们的 早期有适当处理程序的事件 阶段。 ...不要分配 动态控件的属性 (启用视图状态),在 Page_Init 期间, 它不会被反映。 "

    我希望即使使用更新面板,您也需要注意动态控件的 page_load 限制。

    让我知道这是否有帮助或者我是否错过了标记!

    让我们尝试一种不同的做法(我已经开始使用动态文件上传,但它是一个熊,我希望我只是使用这个) http://www.asp.net/ajaxlibrary/act_AsyncFileUpload.ashx

    http://en.fileuploadajax.subgurim.net/

    这些可能不会创建元素的“循环”,但您可以根据需要继续加载文档。

    我专门用过 http://www.asp.net/ajaxlibrary/act_AsyncFileUpload.ashx 效果很好。

    更新似乎也有一些限制:面板和文件上传,请查看这些网站。

    (这个说它在部分更新状态下不起作用,但在完全回发状态下起作用) http://forums.asp.net/p/1105208/1689084.aspx

    您知道提交是触发整个页面还是仅触发更新:面板? (看看这个:http://geekswithblogs.net/mmintoff/archive/2009/04/01/fileupload-within-updatepanel.aspx

    【讨论】:

    • 非常感谢,您给我的第二个链接已清除。我只需要在 Page_Load 中加载控件!
    • 好吧,也许我有点太仓促了。因为我每次都在 Page_Load 上重新创建控件,所以它们在提交时包含的任何值都会丢失。有什么想法吗?
    • @先生。 Smith,您需要在每个页面加载时创建控件。将此部分放入 page_init 中,它们将在每次加载时重新创建,但是当加载视图状态时,您的值将被重新输入(通过视图状态)。通过 page_load 已经加载了视图状态
    • 感谢您的回复。我尝试将动态生成放在 Page_Init 中,但没有成功。当我进入迭代部分时,它确实找到了控件,但它们没有“文件”(即 FileUpload.HasFile)。
    • @Mr.史密斯,在 ajax 中获取文件加载器可能是一种尝试,我会尝试使用 asp.net ajax 工具包(我已经开始处理文件上传)或任何其他免费的工具包(我链接一个看起来相当不错的)。至于没有文件,我仍然想知道生命周期阶段,当您创建控件时,您没有放入任何可能覆盖回发数据的属性?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多