To jest rzeczywiście gorsze niż myślisz - "tylko ponowne zarejestrowanie go i nie wykonanie go" nie jest również opcją. Metoda rejestru sprawdza, czy skrypt jest już zarejestrowany z tym kluczem i nic nie robi, jeśli jest. Po wywołaniu RegisterStartupScript
, nic, co możesz zrobić, nie spowoduje wyłączenia tego skryptu.
Jeśli chodzi o to, dlaczego Microsoft to zrobił, domyślam się, że możliwość zmiany lub usunięcia zarejestrowanych skryptów została po prostu zapomniana po pierwszym zaprojektowaniu RegisterStartupScript
. Wybrane opcje sprawiły, że nietrywialne stało się cofnięcie i utworzenie metody wyrejestrowania, więc teraz będą mieli do tego dobry powód.
Po zarejestrowaniu skryptu jest on przechowywany w dwóch miejscach w kliencie ClientScriptManager. ListDictionary pozwala sprawdzić, czy skrypt jest już zarejestrowany, a ArrayList przechowuje rzeczywiste skrypty, ponieważ będą one renderowane. Zakładam, że ArrayList służy do zapewnienia, że skrypty są renderowane w kolejności, w jakiej zostały zarejestrowane, ale oznacza to również, że nie można stwierdzić, który ciąg w tablicy ArrayList należy do którego klucza.
Nie byłoby strasznie trudno wyposażyć własną klasę stron metodami MaybeAddStartupScript(key,script)
i ChangedMyMindAboutThatStartupScript(key)
. Przechowuj klucze i skrypty we własnym słowniku, a następnie w PreRender, rejestruj te skrypty, które dotarły do tej pory. Z pewnością jest to irytujące, że trzeba to zrobić samemu.
Po prostu nie interesuje mnie, ** dlaczego ** chciałbyś wyrejestrować skrypt? –
@Ian: ponieważ jeśli przejdziesz do innej strony internetowej iz powrotem za pomocą opcji BACK przeglądarki, skrypt ponownie uruchomi się ponownie! – Fandango68
@IanKemp W moim przypadku było to spowodowane tym, że musiałem uruchomić wyskakujące okienko, ale dopiero po wystąpieniu odrzutu. Sprawdź moją odpowiedź, podczas gdy ten cały problem jest kludge, to był zdecydowanie najmniej kludgy. – paqogomez