Ajax Control Toolkit AsyncFileUploader Control и проблема состояния просмотра / сеанса

в моем проекте мне нужно загрузить файлы, поэтому я решил использовать загрузчик, предоставляемый asp.net ajax controls AsyncFileUPloader. есть четыре блока. Каждый блок содержит два таких загрузчика, поэтому я решил использовать возможности веб-элементов управления asp.net. Я обернул необходимые поля формы в свой пользовательский элемент управления под названием DesignUploader.ascx, теперь мне нужно разместить четыре экземпляра этого элемента управления на моей странице aspx, пожалуйста, обратитесь к оснастке ниже

введите описание изображения здесь

Моя проблема начинается здесь, я должен вставить fileurl в базу данных, и каждый блок генерирует уникальные изменения идентификатора и значения идентификатора после загрузки файла на сервер. Я заметил, что состояние просмотра не работает для меня в случае asyncfileuploader, оно очищает состояние просмотра, потому что за кулисами выполняет секретную обратную передачу на сервер. теперь мне остается только использовать сеанс, но когда пользователь загружает файлы двумя блоками один за другим, тогда путь к файлу из второго / третьего последовательных блоков перезаписывает мой сеанс. Я не знаю, сколько блоков пользователь может использовать для загрузки дизайнов, он может использовать только 1 или все четыре.

Внизу страницы будет кнопка окончательной отправки, при нажатии которой я должен вставить данные в базу данных.

поэтому, когда я пытался сохранить данные в базе данных, сеанс сохраняет значение пути к недавно загруженному файлу для всех записей, моя проблема заключается здесь

Я не знаю, смог ли я правильно описать свою проблему или нет, пожалуйста, извините меня, если она не ясна, и при необходимости оставьте комментарий.

Примечание: я не могу изменить пользовательский интерфейс, потому что клиент настаивает только на этом :(

любая быстрая работа будет очень оценена

Спасибо Девджош


person Devjosh    schedule 21.04.2012    source источник


Ответы (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);
    }
}
person Yuriy Rozhovetskiy    schedule 22.04.2012
comment
Спасибо за ответ. да, как вы сказали, я пробовал этот способ сохранения пути к файлу onfileuploaded, но когда я установил скрытое поле на моей стороне сервера onFileUploaded, скрытое поле не обновляется / не устанавливается, и поэтому я использовал сеанс для хранения в качестве альтернативы прямо сейчас, я не могу почтовый индекс, так как я не на работе. поскольку вы создали настраиваемое событие, я не пробовал таким способом. Я попробую и дам вам знать - person Devjosh; 22.04.2012
comment
В моем коде нет настраиваемых событий. Вы не можете установить значение скрытого поля в обработчике событий UploadedComplete, поскольку он выполняется асинхронно. Но вы можете зарегистрировать в нем javascript для обновления значения скрытого поля на клиенте. Это тот случай, который используется в предлагаемом коде. Обратите внимание, что при выполнении AsyncFileUpload во фрейме вы должны вызвать функцию $get в родительском фрейме. - person Yuriy Rozhovetskiy; 22.04.2012