簡體   English   中英

在更新面板中的ASP.Net AjaxControlToolkit AsyncFileUpload在服務器端代碼中使用母版頁c#創建

[英]ASP.Net AjaxControlToolkit AsyncFileUpload in update panel that is created in server-side code with master page c#

我一直忙於整個上午,試圖從asp.net AjaxControlToolkit獲得AsyncFileUpload控件以在我的情況下正常工作,但是沒有運氣。

我有一個啟用Ajax的頁面,該頁面向用戶顯示問題,然后允許在不進行整頁發帖的情況下向前和向后瀏覽問題,可以在頁面上顯示多個問題,其中一個或多個問題可以是文件上傳控件。 該頁面使用的母版頁包含form元素,由於許多答案似乎已將其更改,因此我對其進行了修改。

該頁面和解決方案都引用了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代碼上,而是在服務器端加載的,所以那里可能存在問題。 我因此而無法觸發“后退”和“后退”按鈕事件的問題,不得不最終將代碼實際添加到這些控件的updatepanel中,以觸發事件,但這不是問題控件的選項,因為它會發生變化從一頁到另一頁。

希望能解決問題的最后一點信息,該控件確實出現在頁面上,我可以單擊它並瀏覽到一個文件,但是當我選擇該文件時,它似乎調用了Page_Load,並且沒有其他顯示,隨后出現了兩個彈出窗口

 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瀏覽器中都會發生這種情況

在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版本作為最新版本,問題仍然存在。

問題解決了

我沒有意識到的是,發生部分頁面回發時,沒有填充任何動態創建的字段。 看一看之后:

我發現控件需要在頁面加載之前重新初始化,即在Page_Init中,我稍稍更改了代碼,以便在_displaySingleQuestion()方法中告訴會話“問題ID”是什么,然后在Page_Init中調用該方法,以便控件當前問題在要通過save方法查詢的頁面上。

    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; }

因此,它將僅嘗試獲取部分頁面回發而不是整個頁面的值,例如第一次加載頁面時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM