2

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

在此处输入图像描述

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

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

因此,当我尝试将数据保存到数据库时,会话存储所有记录的最近上传的文件路径的值,我的问题就在这里

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

注意:我不能更改用户界面,因为客户只坚持这样做:(

任何快速解决方法将不胜感激

谢谢 Devjosh

4

1 回答 1

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);
    }
}
于 2012-04-22T09:31:49.260 回答