0

警告!この問題は心のフェイントのためではありません。トラブルシューティングに数日を費やしました。

私は約5つのステップを持つコントロールを持っており、それぞれにsとesWizardに基づくカスタムjQueryコンボボックスなどの非常に単純なものから非常に複雑なものまでのいくつかのコントロールがあります。各ステップには、コントロールにラップされたいくつかのコントロールがあります。DropDownListTextBoxPlaceHolder

WizardとすべてのPlaceHoldersとその子は、のaのControls中にネストされます。同じページに、フォームのような別のスタイルがありますが、1つではありません。このビューには、の各ステップ内ののそれぞれに対応するがあります。ViewMultiViewViewPlaceHolderPlaceHolderWizard

ReferralUrlに応じて、次の関数を呼び出して、Wizardすべてのコントロールを移動し、アクティブなビューを次のように設定して、ビューをフォームスタイルビューに「切り替え」ます。

Protected Sub ToggleView() Handles ViewToggle.Click
    If Wizard_mv.ActiveViewIndex = 0 Then
        ViewToggle.Text = "Toggle Wizard View"
        fPH1.Controls.Add(wPH1)
        fPH2.Controls.Add(wPH2)
        fPH3.Controls.Add(wPH3)
        fPH4.Controls.Add(wPH4)
        fPH5.Controls.Add(wPH5)
        Wizard_mv.ActiveViewIndex = 1
    ElseIf Wizard_mv.ActiveViewIndex = 1 Then
        ViewToggle.Text = "Toggle Form View"
        wPH1.Controls.Add(fPH1)
        wPH2.Controls.Add(fPH2)
        wPH3.Controls.Add(fPH3)
        wPH4.Controls.Add(fPH4)
        wPH5.Controls.Add(fPH5)
        Wizard_mv.ActiveViewIndex = 0
    End If
End Sub

この直後に、別の関数を使用して、データベース内のレコードの値をコントロールに事前入力します。ユーザーに変更を許可した後、更新されたレコードをデータベースに再送信できます。問題は、これWizardを切り替えた後ではなく、から行った場合に問題なく機能することです。トレースはControl Tree、更新されたレコードを送信した時点でが空であることを示しているため、このビューからユーザーが入力した/事前に入力した値を取得できません。事前入力はうまく機能し、「選択された」値はすべて正しいです。[送信]をクリックした後、PostBackで問題が発生し、すべての値とコントロールが失われます。

私の問題を完全に理解し、喜んで助けてくれない限り、答えないでください。問題はページのライフサイクルにあると思います。不思議なことに、ウィザードから送信すると、Page_Initのポストバックでコントロール値が読み込まれますが、フォームビューから送信すると、コントロールもその値も読み込まれません。私が読んだところによると、これは永続性の問題です。これには比較的簡単な解決策があることを本当に望んでいます。

これが私のマークアップのサンプルですWizard(簡潔にするためにすべてのスタイルを削除しました):

<asp:WizardStep ID="WizardStep1" runat="server" Title="Product Info">
    <asp:PlaceHolder ID="wPH1" runat="server" ViewStateMode="Enabled">
        <asp:Table ID="ProductInfoTable" runat="server" Width="100%">
            <asp:TableHeaderRow>
                <asp:TableHeaderCell><h3>Product Line</h3></asp:TableHeaderCell>
                <asp:TableHeaderCell><h3>Publication Type</h3></asp:TableHeaderCell>
                <asp:TableHeaderCell><h3>Request Type</h3></asp:TableHeaderCell>
            </asp:TableHeaderRow>
            <asp:TableRow>
                <asp:TableCell>
                    <div class="ui-widget">
                        <!-- Autocomplete Combobox -->
                        <asp:DropDownList ID="productLine_ddl" runat="server" DataSourceID="productLineSDS" ViewStateMode="Enabled" DataTextField="Product" DataValueField="ID"></asp:DropDownList>
                        <asp:TextBox ID="productLine_cb" runat="server" EnableViewState="True"></asp:TextBox>
                        <button id="productLine_btn" type="button" title="Show All Items"></button>
                    </div>
                </asp:TableCell>
                <asp:TableCell>
                    <asp:DropDownList ID="docType_ddl" runat="server" DataSourceID="docTypeSDS" DataTextField="DocType" DataValueField="ID"></asp:DropDownList>
                </asp:TableCell>
                <asp:TableCell>
                    <asp:DropDownList ID="requestType_ddl" runat="server" DataSourceID="requestTypeSDS" DataTextField="RequestType" DataValueField="ID"></asp:DropDownList>
                </asp:TableCell>
            </asp:TableRow>
            <asp:TableRow>
                <asp:TableCell ColumnSpan="2">
                    <asp:MultiView ID="Attachment_mv" runat="server" ActiveViewIndex="0">
                        <!-- File Upload/Browsing Display -->
                        <asp:View ID="AttachmentUploadView" runat="server">
                            <h3 class="inlineH">Attach File: </h3>
                            <asp:FileUpload ID="AttachmentFile_btn" runat="server" />
                            <asp:Button ID="UploadFile_btn" runat="server" Text="Upload File" />
                        </asp:View>
                        <!-- File Attached Display -->
                        <asp:View ID="FileAttachedView" runat="server">
                            <h3 class="inlineH">Uploaded File: </h3>
                            <asp:Label ID="FileAttachedLabel" runat="server" Text="Label"></asp:Label>
                            <asp:Literal ID="FilesOnServer" runat="server" />
                        </asp:View>
                    </asp:MultiView>
                </asp:TableCell>
            </asp:TableRow>
        </asp:Table>
    </asp:PlaceHolder>
</asp:WizardStep>

要求に応じて、マイページライフサイクルイベント(便宜上、時系列で):)

Dim referrerPage As String
'Initialize Dynamic controls here. These are controls that need to be prefilled, etc.
Private Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Init
    'DO NOT PREFILL at this stage, as the Controls are not yet rendered and will cause errors.
    '  Use this section for detecting the "referrerPage" and missing "id" parameters when expected, etc.
    If Not IsPostBack Then
        ViewState.Clear()
    End If

    Try
        referrerPage = Right(Request.UrlReferrer.AbsolutePath, Len(Request.UrlReferrer.AbsolutePath) - Request.UrlReferrer.AbsolutePath.LastIndexOf("/"c) - 1)
    Catch ex As Exception
        If Not String.IsNullOrEmpty(Session.Item("referrerPage")) Then
            referrerPage = Session.Item("referrerPage")
        End If
    End Try

    If StrComp(referrerPage, "wizard.aspx") <> 0 And String.IsNullOrEmpty(Session.Item("referrerPage")) Then 'Initialize Session state to remember "referrerPage"
        Session.Add("referrerPage", referrerPage)
    End If
    If StrComp(referrerPage, "formdetails.aspx") = 0 Then
        If String.IsNullOrEmpty(Request.Params("id")) Then
            'This line checks for an expected "id" param value and if none exists, forwards the page back to "tcom.aspx"
            Response.Redirect(Request.UrlReferrer.AbsolutePath)
        Else
            ToggleView()
        End If
    End If
End Sub

'Prefill Dynamic controls here.
Private Sub Page_PreLoad(sender As Object, e As EventArgs) Handles Me.PreLoad
    If Not IsPostBack Then
        productLine_ddl.DataBind()
        docType_ddl.DataBind()
        requestType_ddl.DataBind()
        '...and several more DataBinds for each individual
        '   control in the wizard. Nothing more.
    End If
End Sub

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    If Not IsPostBack Then
        'Benign code for querying the database to get User info for Page.User.Identity.Name
    End If
End Sub

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRender
    If Not IsPostBack Then
        'Here is completely benign code for hiding a couple controls.
    End If
End Sub

Protected Sub Page_PreRenderComplete(ByVal sender As Object, ByVal e As EventArgs) Handles Me.PreRenderComplete
    'PREFILL HERE when appropriate. This occurs after checking the "referrerPage" and ensuring a value for the "id" parameter.
    If Not IsPostBack Then
        Try
            If Not String.IsNullOrEmpty(Request.Params("id")) Then
                PrefillWizard(Request.Params("id"))
            Else : output.Text += "Source: " + Request.UrlReferrer.AbsolutePath
            End If
        Catch ex As Exception
        End Try
    End If
End Sub

これを手伝ってくれる人には、私の永遠の感謝の気持ちがあります。;)

4

1 に答える 1

1

問題は、ページのコントロールツリーがすべてのポストバックで完全に同じでなければならないことです。つまり、マテリアルが設定されていないたびに、すべてのコントロールActiveViewIndexを追加する必要があります。できればinCreateChildControlsまたはpageinit。ToggleView関数では、コントロールの可視性を設定することができます。

于 2011-11-22T22:29:19.860 に答える