Ajax Control Toolkit AsyncFileUploader控件和viewstate / session问题

时间:2012-04-21 07:01:29

标签: asp.net session ajaxcontroltoolkit viewstate asyncfileupload

在我的项目中我需要上传文件,所以我决定使用asp.net提供的上传器ajax控件 AsyncFileUPloader 控件。 有四个街区。每个块包含两个这样的上传者 所以我决定利用asp.net web用户控件的强大功能。 我在名为DesignUploader.ascx的用户控件中包装了所需的表单字段 现在我必须将这个控件的四个实例放在我的aspx页面上 请参阅下面的说明

enter image description here

我的问题从这里开始我必须将fileurl插入数据库,并且每个块在将文件上传到服务器后生成唯一的id和id值更改。我注意到,如果asyncfileuploader它清除了视图状态,那么viewstate对我不起作用,因为它在幕后对服务器进行了秘密回发。现在只剩下我的选择是使用会话,但是当用户一个接一个地上传两个块中的文件时,来自第二个/第三个连续块的文件路径会覆盖我的会话。我不知道用户可以使用多少块来上传他可能只使用1的设计,或者他可以使用全部四种。

点击页面底部会有一个最终提交按钮,我必须将数据插入数据库。

  

所以当我试图将数据保存到数据库时,会话存储了最近上传的文件路径的值,我所遇到的所有记录都是

我不知道我是否能够以正确的方式描述我的问题,如果不清楚请原谅我并在必要时发表评论。

注意:我无法更改UI,因为客户端仅坚持这样做:(

任何快速的工作都会受到赞赏

由于 Devjosh

1 个答案:

答案 0 :(得分:2)

我相信您以错误的方式将文件路径保存到会话中,并且无法识别没有代码的错误在哪里。 一直以来,在我看来,最好不要在会话中保留文件路径,而是将客户端用于此目的。您可以向DesignUploader.ascx控件添加两个隐藏字段,并在UploadedComplete事件处理程序中设置它们的值。

public partial class DesignUploader : System.Web.UI.UserControl
{
    private static readonly string AppDataPath = HttpContext.Current.Server.MapPath("~/App_Data/");

    public string FirstFilePath
    {
        get
        {
            return Server.UrlDecode( FirstFilePathHiddenField.Value);
        }
    }

    public string SecondFilePath
    {
        get
        {
            return Server.UrlDecode(SecondFilePathHiddenField.Value);
        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        FirstFileUpload.UploadedComplete += FirstFileUpload_UploadedComplete;
        SecondileUpload.UploadedComplete += SecondileUpload_UploadedComplete;
    }

    void FirstFileUpload_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        var fullPath = Path.Combine(AppDataPath, Path.GetFileName(e.FileName));
        FirstFileUpload.SaveAs(fullPath);
        SaveFilePathToHiddenField(FirstFilePathHiddenField.ClientID, fullPath);
    }

    void SecondileUpload_UploadedComplete(object sender, AjaxControlToolkit.AsyncFileUploadEventArgs e)
    {
        var fullPath = Path.Combine(AppDataPath, Path.GetFileName(e.FileName));
        SecondileUpload.SaveAs(fullPath);
        SaveFilePathToHiddenField(SecondFilePathHiddenField.ClientID, fullPath);
    }

    private void SaveFilePathToHiddenField(string fieldId, string pathValue)
    {
        var script = string.Format("top.$get('{0}').value = '{1}';", fieldId, Server.UrlEncode(pathValue));
        ScriptManager.RegisterStartupScript(this, this.GetType(), "setPath", script, true);
    }
}