2

私は、asp.net AjaxControlToolkitからAsyncFileUploadコントロールを取得しようとして、運が悪かったので、午前中ずっと歩き回っていました。

ユーザーに質問を表示するAjax対応のページがあり、ページ全体の投稿を必要とせずに質問を前後に移動できます。ページに複数の質問を表示でき、これらの質問の1つ以上を表示できます。ファイルアップロードコントロール。このページでは、問題であると思われる多数の回答の結果として変更したフォーム要素を含むマスターページを使用しています。

ページとソリューションの両方に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、およびIE9でテストされたすべてのブラウザーで発生します

Firefoxのfirebugでは、関連する可能性のある次のjavaScriptエラーも発生します

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

どんな助けでもいただければ幸いです。

編集2011/12/13最新バージョンとして本日ダウンロードしたAjaxControlToolkitバージョン4.1.5を使用していますが、問題は解決しません。

4

1 に答える 1

2

問題が解決しました

私が気付いていなかったのは、部分的なページのポストバックが発生したときに、動的に作成されたフィールドのいずれにもデータが入力されていないことでした。これを見た後:

ページを読み込む前にコントロールを再初期化する必要があることを発見しました。つまり、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; }

そのため、ページが最初にロードされたときなど、ページ全体ではなく、部分的なページのポストバックでのみ値を取得しようとします。

于 2011-12-13T16:44:01.517 に答える