نگهداری وضعیت کنترل FileUpload بعد از PostBack

یکشنبه 15 شهریور 1394

در این پست خواهیم دید که چگونه وضعیت یک کنترل FileUpload را بعد از PostBack نگه داریم.

نگهداری وضعیت کنترل FileUpload بعد از PostBack

هنگامی که یک کاربر در کنترل File Upload یک فایلی را انتخاب می کند، در هر انتخاب، وقتی که رویداد post back اتفاق می افتد، کنترل file upload مقدارش را از دست می دهد. این یک مشکل رایج برای بسیاری از برنامه نویسان می باشد.

کنترل File Upload در ASP.NET

کنترل file upload شامل یک text box و یک دکمه Browse می باشد. وقتی که یک فایل انتخاب می شود، در PostBack خصوصیت فایل پست شده (انتخاب شده) توسط شی کلاس HttpPostedFile  بدست می آید. همانطور که می دانیم، درخواست http نمی تواند وضعیت (state) را نگهداری کند و فایل پست شده که با شی کلاس HttpPostedFile کار می کند، بنابراین وضعیت فایل از دست می رود و نگه داشته نمی شود. خصوصیات فایل پست شده، می تواند برای بدست آوردن اطلاعاتی مانند طول محتوا، نوع محتوا، نام فایل، جریان ورودی و غیره استفاده شود. همچنین یک متد SAveAs برای نگهداری فایل روی دیسک دارد. 

راه حل

بهترین راه حل با کمترین تلاش Session می باشد. همانطور که می دانیم شی Session  می تواند هر Object ی را ذخیره کند و تنها در این مورد تنها شی ای از نوع OutProc/State Server Serializable را در session ذخیره می کند.

بنابراین این ایده، بسیار آسان شی FileUpload را در Session ذخیره می کند و در post back مقادیر را از آن بدست می آورد. از کدهای آمده در زیر، در PageLoad استفاده کنید.

//If first time page is submitted and we have file in FileUpload control but not in session
// Store the values to SEssion Object
if (Session["FileUpload1"] == null && FileUpload1.HasFile)
{
    Session["FileUpload1"] = FileUpload1;
    Label1.Text = FileUpload1.FileName;
}
// Next time submit and Session has values but FileUpload is Blank
// Return the values from session to FileUpload
else if (Session["FileUpload1"] != null && (! FileUpload1.HasFile))
{
    FileUpload1 = (FileUpload) Session["FileUpload1"];
    Label1.Text = FileUpload1.FileName;
}
// Now there could be another sictution when Session has File but user want to change the file
// In this case we have to change the file in session object
else if (FileUpload1.HasFile)
{
    Session["FileUpload1"] = FileUpload1;
    Label1.Text = FileUpload1.FileName;
}

 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید