Πώς να πάρει το έγγραφο CDHtmlDialog μετά Asp.Net AJAX UpdatePanel

ψήφοι
1

Όταν η σελίδα που εμφανίζεται στο CDHtmlDialog μας κάνει μια Asp.Net AJAX UpdatePanel έχουμε μια εκδήλωση πλοήγηση, αλλά πάντα μετά από αυτό φαίνεται να χάνεται. Δεν έχουμε ένα έγγραφο πια ή να πάρετε κανένα γεγονός ποντικιού στη σελίδα.

Δημοσιεύθηκε 10/12/2008 στις 00:25
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Φαίνεται σαν να έκανε την αρχική θέση ως μη εγγεγραμμένος χρήστης, οπότε δεν νομίζω ότι μπορώ να το επεξεργαστείτε. Ήμασταν σε θέση να εργαστεί γύρω από το αρχικό θέμα, αλλά ήρθε και πάλι σε ένα διαφορετικό πλαίσιο (πραγματικά αρχίζουν να μισούν CDHTMLDialog).

Εδώ είναι η αιτία του προβλήματος:
Τα Javascript κλήσεις προκαλώντας μια εκδήλωση Πλοηγηθείτε και CDHtmlDialog :: OnBeforeNavigate παίρνει ονομάζεται και αποσυνδέεται και να διαγράφει το IHTMLDocument2. Δυστυχώς, δεν είναι μια πραγματική Πλοηγηθείτε δεδομένου ότι η σελίδα δεν άλλαξε ποτέ. Αυτό σημαίνει CDHtmlDialog :: OnNavigateComplete δεν καλείται να πάρει το έγγραφο πίσω.

Για να κάνετε τα πράγματα χειρότερα, όταν αντικαθιστούν CDHtmlDialog :: OnBeforeNavigate βρω το string διεύθυνση URL είναι δυσανάγνωστο (bug);

Η πιο απλή (; καλύτερη) λύση:
Πρέπει να υποκλέψει το γεγονός Πλοηγηθείτε Πριν και μόνο καλέστε _OnBeforeNavigate2 του CDHtmlDialog, αν η διεύθυνση URL δεν είναι μια δράση javascript:

BEGIN_EVENTSINK_MAP(CMyHTMLDlg, CDHtmlDialog)
    ON_EVENT(CMyHTMLDlg, AFX_IDC_BROWSER, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2, VTS_DISPATCH VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_PBOOL)
END_EVENTSINK_MAP()

void CMyHTMLDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL,VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData,VARIANT* Headers, BOOL* Cancel)
{

    ...

    if (URL != NULL)
    {
        // Check if navigation is to a folder..
        CString url = CString(*URL);

        if(url.Left(11) != _T("javascript:"))
        {
            _OnBeforeNavigate2(pDisp, URL, Flags, TargetFrameName, PostData, Headers, (BOOL*)Cancel);
            // If dynamic linking MFC then the above handler doesn't exist. Need to call OnBeforeNavigate direct. 
            // This is from a code site, and it compiles, but I've never tested it to see if it works.
            //CDHtmlDialog::OnBeforeNavigate(pDisp,(LPCSTR)URL);
        }
    }
}

Το μεγαλύτερο μέρος αυτού είναι αρκετά πρότυπο για τη δημιουργία μιας υποκατηγορίας CDHtmlDialog, και είναι αρκετά απλό στην πραγματικότητα, αλλά μου πήρε λίγο να καταλάβω πώς να χειριστεί το JavaScript. Δυστυχώς, δεν είμαι σίγουρος πως αυτό θα λειτουργήσει εάν η Javascript είναι κάνει δυναμικές αλλαγές στην ίδια τη σελίδα.

Ένα ζευγάρι σημειώσεις:

  • Αν πρέπει να ακυρωθεί εντελώς εδώ η πλοήγηση, στη συνέχεια, ορίστε * Ακύρωση = true και δεν απαιτούν _OnBeforeNavigate2. Να είστε προσεκτικοί εδώ, διότι αυτό ακυρώνει επίσης οποιαδήποτε ενέργεια JavaScript.
  • Δεν ήταν σαφές μέχρι που είδα την πηγή , αλλά CDHtmlDialog :: _ OnBeforeNavigate2 καλεί μόνο CDHtmlDialog :: OnBeforeNavigate.
Απαντήθηκε 02/02/2009 στις 18:34
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more