ASP.Net AjaxControlToolkit AsyncFileUpload в панели обновления, которая создается в коде на стороне сервера с главной страницей c # - PullRequest
2 голосов
/ 13 декабря 2011

Я трахал все утро, пытаясь получить элемент управления AsyncFileUpload от asp.net AjaxControlToolkit для работы в моей ситуации, но мне не повезло.

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

Страница и решение имеют ссылки на AjaxControlToolkit

    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

Код, который строит вопросы, выглядит следующим образом

 1.  private Control _generateControl(FormFields formFieldObject, string questionID) {
 2.         logger.Debug("start of method _generateControl()");
 3.         Control genericControl = _formBLL.getControlForForm(formFieldObject);
 4.         Type typeofcontrol = genericControl.GetType();
 5.         logger.Debug(typeofcontrol.ToString());
 6.  
 7.         HtmlGenericControl controlHolder = new HtmlGenericControl("div");
 8.         controlHolder.ID = _ns + "formfieldHolder_" + formFieldObject.id;
 9.         controlHolder.Attributes.Add("class", _ns + "formfieldHolder");
 10. 
 11.        if (typeofcontrol == typeof(AsyncFileUpload))
 12         {
 13.            #region display question number and question
 14.            Label questionIDLabel = new Label();
 15.            questionIDLabel.CssClass = _ns + "questionIDLabel";
 16.            questionIDLabel.Text = questionID;
 17.            Label questionText = new Label();
 18.            questionText.CssClass = _ns + "questionText";
 19.            questionText.Text = formFieldObject.name;
 20.            #endregion
 21.
 22.            #region add holder for file upload control
 23.            HtmlGenericControl questionControlHolder = new HtmlGenericControl("div");
 24.            questionControlHolder.Attributes.Add("class", _ns + "questionControlHolder");
 25.            genericControl.ID = _ns + "questionControl_" + formFieldObject.id;
 26.            #endregion
 27.
 28.            AsyncFileUpload fuc = (AsyncFileUpload)genericControl;
 29.            fuc.ID = _ns + "questionControl_" + formFieldObject.id;
 30.            fuc.ClientIDMode = ClientIDMode.AutoID;
 31.            fuc.UploadedComplete += fileuploadClick;
 32.            fuc.UploadedFileError += fileuploadError;
 33.            questionControlHolder.Controls.Add(fuc);
 34.
 35.            // add the controls to the holder
 36.            #region add controls to page
 37.            controlHolder.Controls.Add(questionIDLabel);
 38.            controlHolder.Controls.Add(questionText);
 39.            controlHolder.Controls.Add(questionControlHolder);
 40.            #endregion
 41.        }
 42.        return controlHolder;
 43.  }

Затем к заполнителю на странице aspx добавляется элемент управления

 <asp:UpdatePanel ID="questionPanel" runat="server" UpdateMode="Conditional">     
    <ContentTemplate>           
        <asp:PlaceHolder ID="QuestionSection" runat="server">             
        </asp:PlaceHolder>
    </ContentTemplate>    
</asp:UpdatePanel>

Ниже приведены методы, которые должны вызываться, но при отладке и проверке файлов журнала в Visual Studio эти методы никогда не выполняются.

    public void fileuploadError(object sender, AsyncFileUploadEventArgs e)
    {
        logger.Debug("START method fileuploadError()");
        logger.Debug("END method fileuploadError()");
    }
    public void fileuploadClick(object sender, AsyncFileUploadEventArgs e)
    {
        logger.Debug("START method fileuploadClick()");            
        logger.Debug("END method fileuploadClick()");
    }

Другие Ответы предположили, что есть проблема с переключением видимой настройки элемента управления между true / false, но когда страница загружается непосредственно по URL или навигацией с использованием кнопок «вперед» и «назад» в приложении, видимость элемента управленияникогда не меняется.

Хотя это заставило меня учесть, что, поскольку элемент управления находится не в aspx-коде страницы, а загружен на сервер, там может быть проблема.У меня была проблема с тем, что события кнопок «Далее» и «Назад» не запускаются из-за этого, и мне пришлось в конечном итоге добавить код в панель обновления для этих элементов управления, чтобы вызвать событие, но это не вариант для элемента управления вопросом, поскольку он изменяетсясо страницы на страницу.

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

 Server Response Error: 'Unknown Server Error'
 Do You want to see the response page?

, а затем

 Unhandled Exception: Server Response Error: 'Unknown Server Error'

Это происходит во всех протестированных браузерах FF 8, Chrome 15.0 и IE 9

В Firebug в Firefox я также получаю следующую ошибку javaScript, которая может быть связана

 Index or size is negative or greater than the allowed amount
 [Break On This Error] Type.registerNamespace("Sys.Extended.U...FileUploadEventArgs",Sys.EventArgs); 

Любая помощь будет принята.

РЕДАКТИРОВАТЬ 13/12/2011 Я использую AjaxControlToolkit версии 4.1.5, загруженную сегодня как последнюю версиюверсия и проблема все еще сохраняется.

1 Ответ

1 голос
/ 13 декабря 2011

Проблема решена

Что я не осознавал, так это то, что ни одно из моих динамически созданных полей не было заполнено, когда произошла частичная обратная запись страницы. Посмотрев на это:

Я обнаружил, что элементы управления должны быть повторно инициализированы перед загрузкой страницы, т. Е. В Page_Init, я немного изменил код так, чтобы в методе _displaySingleQuestion () я рассказал сессии, что такое идентификатор вопроса, а затем вызвал метод в Page_Init так, элементы управления для текущего вопроса находились на странице для запроса методом сохранения.

    public void Page_Init(object sender, EventArgs e)
    {
        logger.Debug("Page_Init START");
        if (!Page.IsPostBack) { Session["qid"] = 0; }
        int qid = Convert.ToInt32(Session["qid"]);
        if (qid > 0)
        {
            _displaySingleQuestion(_formObject, qid);
        }
        logger.Debug("Page_Init END");
    }

Это также означало, что AsyncFileUpload необходимо было повторно инициализировать перед продолжением страницы, после чего мой метод ведения журнала теперь записывает, что событие fileuploadClick () успешно вызывается.

Обратите внимание, я добавил строку

 if (!Page.IsPostBack) { Session["qid"] = 0; }

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

...