【问题标题】:Ajax Control Toolkit AsyncFileUploader Control and viewstate/session IssueAjax 控件工具包 AsyncFileUploader 控件和视图状态/会话问题
【发布时间】:2012-04-21 07:01:29
【问题描述】:

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

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

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

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

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

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

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

谢谢 德约什

【问题讨论】:

    标签: asp.net session ajaxcontroltoolkit viewstate asyncfileupload


    【解决方案1】:

    我相信您以错误的方式将文件路径保存到会话,并且如果没有代码就无法识别错误在哪里。 一路走来,在我看来,最好不要在会话中保留文件路径,而是使用客户端来代替。您可以在 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);
        }
    }
    

    【讨论】:

    • 感谢您的回答。是的,正如你所说,我尝试了存储文件路径 onfileuploaded 事件的方式,但是当我在服务器端 onFileUploaded 事件中设置隐藏字段时,隐藏字段不会更新/设置,这就是为什么我现在使用会话存储作为替代方法我不能邮政编码,因为我不在我的工作场所。当您提出自定义事件时,我还没有尝试过这种方式。我会尝试一下并让您知道
    • 我的代码中没有自定义事件。您不能在 UploadedComplete 事件处理程序中设置隐藏字段值,因为它是异步执行的。但是您可以在其中注册 javascript 以更新客户端上的隐藏字段值。这是建议代码中使用的情况。请注意,在框架中执行 AsyncFileUpload 时,您必须在父框架中调用 $get 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多