在我的项目中我需要上传文件,所以我决定使用asp.net提供的上传器ajax控件 AsyncFileUPloader 控件。 有四个街区。每个块包含两个这样的上传者 所以我决定利用asp.net web用户控件的强大功能。 我在名为DesignUploader.ascx的用户控件中包装了所需的表单字段 现在我必须将这个控件的四个实例放在我的aspx页面上 请参阅下面的说明
我的问题从这里开始我必须将fileurl插入数据库,并且每个块在将文件上传到服务器后生成唯一的id和id值更改。我注意到,如果asyncfileuploader
它清除了视图状态,那么viewstate对我不起作用,因为它在幕后对服务器进行了秘密回发。现在只剩下我的选择是使用会话,但是当用户一个接一个地上传两个块中的文件时,来自第二个/第三个连续块的文件路径会覆盖我的会话。我不知道用户可以使用多少块来上传他可能只使用1的设计,或者他可以使用全部四种。
点击页面底部会有一个最终提交按钮,我必须将数据插入数据库。
所以当我试图将数据保存到数据库时,会话存储了最近上传的文件路径的值,我所遇到的所有记录都是
我不知道我是否能够以正确的方式描述我的问题,如果不清楚请原谅我并在必要时发表评论。
注意:我无法更改UI,因为客户端仅坚持这样做:(
任何快速的工作都会受到赞赏
由于 Devjosh
答案 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);
}
}