Czy jest jakiś sposób zmodyfikować ciągi kwerend bez zerwania odświeżenie strony ASP.NET?




Od czytania tutaj i wokół netto, jestem blisko zakładając, że odpowiedź brzmi „nie”, ale ...


Załóżmy, że mam strony ASP.NET, że czasami ma parametr ciąg kwerendy. Jeśli strona ma parametru ciąg kwerendy, chcę się rozebrać go przed, w trakcie lub po odświeżenie strony. Strona ma już dużo skrypt po stronie klienta (czysty JavaScript i jQuery).


Jako przykład, powiedzmy załadować:



```
http://myPage.aspx?QS=ABC

```

Parametr QS jest niezbędne do kontrolowania tego, co pojawia się na stronie, gdy pierwsze ładunki i jest ustalana przez strony, że „nazywa” go. `myPage.aspx`posiada elementy formularzy, które należy wypełnić i ma przycisk Prześlij, który nie odświeżenie strony. Gdy strona uzupełnia odświeżenie strony, muszę być zwrócony do adresu URL:



```
http://myPage.aspx

```

w celu uniknięcia kodu po stronie klienta, która jest wywoływana, gdy łańcuch zapytania jest obecny. Innymi słowy, po przedstawienia nie chcę działania niepożądane związane z klientem parametru ciąg kwerendy na ogień. Wiem, że mogę dołączyć zawartość formularza na adres URL jako parametry się łańcuch zapytania i po prostu przekierować do nowego adresu URL i uniknąć dołączania / odświeżenie strony, ale to będzie wymagało dużo więcej typ sprawdzania w kodzie, aby uniknąć złych danych i dorywczo spoofing. Mam mogę też ustawić pole ukryte w kodzie i patrzeć na nią wraz z ciągiem znaków zapytania, aby anulować zachowania po stronie klienta, gdy wracam z odświeżenie strony, ale nadal pozostawia ciąg kwerendy w stanie nienaruszonym w zasadzie zawsze i chcę aby pozbyć się go po początkowym załadowaniu strony.


Wszelkie pomysły i najlepsze praktyki? 


PS - Czy mogę coś zrobić z nieruchomości Form.Action że nie złamie zachowanie ogłaszania zwrotnego?
IAM nie wiem, to jest to, czego szukasz, ale jeśli rozumiem można to zrobić:


-on sprawdzić obciążenie aktualizacja wartości QS, jeśli jej nie ma użyć ukrytego pola wprowadzania.


-pierwsze czas ładowania strony z QS, zrobić swoje normalne przetwarzanie i przechowywanie wartości QS w polu wejściowym ukrytym. 


-Jeśli nie ma QS następnie użyj ukrytej wartości wejściowej


-po odświeżenie strony, można przekierować do tej samej strony, w tym momencie można użytkownik Request.Form [], aby odzyskać pole wprowadzania ukryty, nadal załadować dane poprawnie, ale pozbyć się QS.


to miało sens w mojej głowie, nie jestem pewien, że to ma sens teraz, ale ja nie pozwolę ci zdecydować.
Często jest to realizowane za pomocą [„Data Driven Subskrypcje”](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , ale ta funkcja jest dostępna tylko w niektórych wersjach SQL: Enterprise i Business Intelligence, ale nie w standardzie.


Tak więc istnieje wiele twórczych obejścia. Ale nie lubię żadnego z nich, a wszystko to wymaga uczciwej trochę pracy poza SSRS.


Do obejścia widziałem to: Tworzenie subskrypcji, a następnie wyłączenie lub włączenie zadanie SQL, który wysyła subskrypcję (zidentyfikowanego przez GUID).


Tworzenie .exe .NET otoki do obsługi wysyłania wiadomości e-mail. Można go uruchomić kwerendę najpierw sprawdzić, ile zwracane są wiersze, a następnie w razie potrzeby wygenerować raport i umieścić go w wiadomości e-mail. Obie alternatywy, które zostały wskazane ma wady i zalety, decyzja zależy od tego jak to plusy i minusy wpływa na aplikację:



> 
> Pobrać wszystkie wartości z bazy danych przy użyciu zwykłego PHP następnie przechowywać je w zmiennej JavaScript, później szukać sekund rozwijanej listy (jeśli wartość pierwszej rozwijanej liście na zmiany wartości) w zmiennej JavaScript (array).
> 
> 
> 


Plusy:


* Minimalizuje petycje http, trzeba tylko jedną prośbę, aby odzyskać całość danych.
* Minimalizuje kwerenda jest potrzebne w bazie danych, na ogół tylko wykonać jedno zapytanie.


Cons:


* Zwiększa ilość pamięci używanej jeśli masz duże ilości danych.
* Jeśli dane zmienia się nieustannie, użytkownicy nie widzą zmian aż odświeżyć całą stronę.



> 
> Jeśli pierwszy rozwijanej liście zmian wartości jest następnie pobrać wartości dla drugiej listy rozwijanej z bazą danych za pomocą technologii AJAX (jQuery).
> 
> 
> 


Plusy:


* Nie trzeba do przechowywania wszystkich danych w pamięci całych jedynie dane, które zostaną wykorzystane, co zmniejsza ilość potrzebnej pamięci.
* Twoje dane są aktualizowane za każdym razem, bez konieczności przeładowania strony tylko zmieniając wybór.


Cons:


* Trzeba wykonać kilka petycji HTTP i biegnie querys z bazą danych przy każdej zmianie wyboru.


Osobiście preferuję metodę 2, jeśli ilość danych jest stosunkowo duża i wydajność nie jest koniecznością. <p>jak już powiedziano, nie ma sposobu.</p><p>jedną z rzeczy, które robimy, jest szybkie sprawdzenie w nagłówku skryptu, aby ustalić, czy tryb sqlcmd jest włączony (i zakończyć skrypt, jeśli nie jest):</p><pre><code>:setvar databasename "mydatabase" go if ('$(databasename)' = '$' + '(databasename)') raiserror ('this script must be run in sqlcmd mode. disconnecting.', 20, 1) with log go -- the below is only run if sqlcmd is on, or the user lacks permission to raise fatal errors if @@error != 0 set noexec on go print 'you will not see this unless sqlcmd mode is on' -- rest of script goes here go set noexec off go </code></pre><p>jest powód, dla którego używany jest wskaźnik ważności 20, który ma tendencję do natychmiastowego przerywania połączenia, uniemożliwiając uruchomienie dodatkowego kodu skryptu, nawet jeśli w skrypcie znajdują się <code>go</code> terminatory wsadowe.</p><blockquote> <p> <a href="https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-error-severities">istotność 20–24</a> :</p> <p>wskazują problemy systemowe i są to błędy krytyczne, co oznacza, że ​​zadanie aparatu bazy danych, które wykonuje instrukcję lub partia, nie jest już uruchomione. zadanie rejestruje informacje o tym, co się wydarzyło, a następnie zostaje zakończone. w większości przypadków <strong> połączenie aplikacji z instancją aparatu bazy danych może również zostać zakończone </strong>. jeśli tak się stanie, w zależności od problemu aplikacja może nie być w stanie połączyć się ponownie.</p> <p>komunikaty o błędach w tym zakresie mogą wpływać na wszystkie procesy uzyskujące dostęp do danych w tej samej bazie danych i mogą wskazywać na uszkodzenie bazy danych lub obiektu. komunikaty błędów o poziomie ważności od 19 do 24 są zapisywane w dzienniku błędów.</p> </blockquote> <p>najlepszym sposobem byłoby użycie tabel, które już masz. utwórz dwie tabele - tabela-a, tabela-b na potrzeby testu możesz nawet zaktualizować tę samą kolumnę o te same informacje, aby nie wpływać na żadne rzeczywiste dane.</p><p>na przykład update table\_a ustaw id = id gdzie id = 100;</p><p>otwórz dwie sesje dla tej samej bazy danych. na jeden biegnij</p><pre><code>begin tran update table\_a set id=id where id = 100; </code></pre><p>dwa biegi</p><pre><code>begin tran update table\_b set id=id where id =100; </code></pre><p>następnie skopiuj instrukcje aktualizacji do sesji przeciwnych i uruchom je w tym samym czasie. w jednym,</p><pre><code>update table\_b set id=id where id =100; </code></pre><p>we dwóch</p><pre><code>update table\_a set id=id where id = 100; </code></pre><p>właśnie próbowałem tego teraz i dostałem na ms-sql</p><pre><code>msg 1205, level 13, state 56, line 1 transaction (process id 23) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. rerun the transaction. </code></pre> jak nie trzymasz w niej haseł/zakładek to sprawdź cofnięcie się do wersji fabrycznej przeglądarki lub opcję czyszczenia całej pamięci aplikacji.

wtedy powinna odpuścić aż się nie zaktualizuje do uszkodzonej wersji.

jak musisz zachować tamte dane, to próbuj opcji „wymuś zatrzymanie” (bardzo opcjona… <p>w witrynach, w których pracowałem, wszelkie zmiany, które należy wprowadzić w instancjach produkcyjnych, muszą być skryptowane jako skrypty zmian, które będą działać w sql * plus; ponadto skrypty potrzebne do odtworzenia od podstaw wszystkich obiektów schematu muszą być aktualizowane. wszystkie te skrypty są sprawdzane pod kątem kontroli zmian i stamtąd migrowane.</p><p>możesz kontrolować zmiany ddl lub używać wyzwalaczy ddl, aby wykrywać zmiany, a nawet używać oprogramowania różnicowego do porównywania dwóch wystąpień, ale metody te są niedyskryminujące; często programista wprowadza i cofa wiele zmian w schemacie (np. małe zmiany testowe, tworzenie fałszywych tabel do testowania koncepcji itp.) przed ustaleniem, co dokładnie należy zmienić.</p> Zmiana przeglądarki? <h2>es6 z wykorzystaniem parametrów odpoczynku</h2><p>jeśli możesz użyć es6, możesz użyć:</p><p><strong> <a href="https://developer.mozilla.org/en-us/docs/web/javascript/reference/functions/rest\_parameters">parametry odpoczynku</a> </strong></p><p><div class="snippet" data-lang="js" data-hide="false" data-console="false" data-babel="false"> <div class="snippet-code"> <pre class="snippet-code-js lang-js prettyprint-override"><code>function sortargs(...args) { return args.sort(function (a, b) { return a - b; }); } document.body.innerhtml = sortargs(12, 4, 6, 8).tostring();</code></pre> </div> </div> </p><p>jak możesz przeczytać w <a href="https://developer.mozilla.org/en-us/docs/web/javascript/reference/functions/rest\_parameters">link</a> </p><blockquote> <p>składnia parametru rest pozwala nam reprezentować nieokreśloną liczbę argumentów jako tablicę.</p> </blockquote><p>jeśli interesuje cię składnia <code>...</code>, nazywa się <em>operator rozłożenia</em> i możesz przeczytać więcej <a href="https://developer.mozilla.org/en-us/docs/web/javascript/reference/operators/spread\_operator">tutaj</a> .</p><h2>es6 za pomocą array.from ()</h2><p>używając <strong> <a href="https://developer.mozilla.org/en-us/docs/web/javascript/reference/global\_objects/array/from">array.from</a> </strong>:</p><p><div class="snippet" data-lang="js" data-hide="false" data-console="false" data-babel="false"> <div class="snippet-code"> <pre class="snippet-code-js lang-js prettyprint-override"><code>function sortargs() { return array.from(arguments).sort(function (a, b) { return a - b; }); } document.body.innerhtml = sortargs(12, 4, 6, 8).tostring();</code></pre> </div> </div> </p><p><code>array.from</code> po prostu przekonwertuj obiekty array-podobne lub iterable na instancje array. </p><hr><hr><h2>es5</h2><p>w rzeczywistości możesz po prostu użyć <code>array</code> 's <a href="https://developer.mozilla.org/en-us/docs/web/javascript/reference/global\_objects/array/slice"><code>slice</code></a> function na obiekcie arguments, i przekształci to w standardową tablicę javascript. będziesz musiał odwołać się do niego ręcznie za pośrednictwem prototypu array:</p><pre><code>function sortargs() { var args = array.prototype.slice.call(arguments); return args.sort(); } </code></pre><p>dlaczego to działa? oto fragment z samej dokumentacji <a href="http://es5.github.io/#x15.4.4.10">ecmascript 5</a> :</p><blockquote> <p><strong>uwaga</strong>: funkcja <code>slice</code> jest celowo generyczna; nie wymaga, aby jego wartość <strong>this</strong> była obiektem array. dlatego może być przenoszony na inne rodzaje obiektów do wykorzystania jako metoda. to, czy funkcja <code>slice</code> może zostać pomyślnie zastosowana do obiektu host, zależy od implementacji.</p> </blockquote><p>dlatego <code>slice</code> działa na wszystkim, co ma właściwość <code>length</code>, co <code>arguments</code> wygodnie robi.</p><hr><p>jeśli <code>array.prototype.slice</code> jest dla ciebie za dużo, możesz skrócić go nieco, używając literałów tablicowych:</p><pre><code>var args = [].slice.call(arguments); </code></pre><p>jednak mam wrażenie, że poprzednia wersja jest bardziej jednoznaczna, więc wolałbym ją zamiast tego. nadużywanie literalnej notacji tablicowej jest odrażające i wygląda dziwnie.</p> <h1><strong> nr. </strong></h1><p><strong> <code>truncate</code> i <code>drop</code> są prawie identyczne pod względem zachowania i prędkości, więc wykonanie <code>truncate</code> tuż przed <code>drop</code> jest po prostu niepotrzebne. </strong></p><hr><p><em>waga: napisałem tę odpowiedź z perspektywy sql server i założyłem, że będzie ona miała zastosowanie w równym stopniu do sybase. wygląda na to, że <a href="https://dba.stackexchange.com/q/186154/2660">nie jest tak do końca</a> .</em></p><p><em>waga: kiedy po raz pierwszy opublikowałem tę odpowiedź, było kilka innych wysoko ocenianych odpowiedzi - w tym również odpowiedź zaakceptowana - które złożyły kilka fałszywych twierdzeń, takich jak: <code>truncate</code> nie jest rejestrowany; <code>truncate</code> nie można przywrócić; <code>truncate</code> jest szybszy niż <code>drop</code>; itp.</em></p><p><em>teraz, gdy ten wątek został oczyszczony, następujące obalenia mogą wydawać się styczne do pierwotnego pytania. zostawiam je tutaj jako odniesienie dla innych, którzy chcą obalić te mity.</em></p><hr><p>istnieje kilka popularnych kłamstw - rozpowszechnionych nawet wśród doświadczonych dba - które mogły być tego powodem <code>truncate-then-drop</code> wzór. oni są:</p><ul> <li><strong> mit </strong>: <code>truncate</code> nie jest rejestrowany, dlatego nie można go przywrócić.</li> <li><strong> mit </strong>: <code>truncate</code> jest szybszy niż <code>drop</code>.</li> </ul><p>pozwól mi obalić te kłamstwa. piszę to obalenie z perspektywy sql server, ale wszystko, co tu powiem, powinno mieć również zastosowanie do sybase.</p><h1> <a href="http://msdn.microsoft.com/en-us/library/ms177570.aspx"> obciąć </a> <em>is</em> zalogowany, a <em>can</em> można przywrócić.</h1><ul> <li> <p><strong> <code>truncate</code> jest zarejestrowaną operacją, więc <a href="http://sqlblog.com/blogs/kalen\_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx">to <em>można</em> wycofać</a> . </strong> po prostu zawiń to w transakcji.</p> <pre><code>use [tempdb]; set nocount on; create table truncate\_demo ( whatever varchar(10) ); insert into truncate\_demo (whatever) values ('log this'); begin transaction; truncate table truncate\_demo; rollback transaction; select * from truncate\_demo; drop table truncate\_demo; </code></pre> <p>zauważ jednak, że <strong> jest to <a href="http://psoug.org/reference/truncate.html">nieprawda</a> dla oracle </strong>. chociaż zalogowany i chroniony przez funkcję cofania i ponawiania oracle, <code>truncate</code> i inne instrukcje ddl <em>nie można</em> zostać wycofane przez użytkownika, ponieważ oracle wydaje <a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11\_question\_id:2860243091362">niejawne zobowiązania</a> natychmiast przed i po wszystkich instrukcjach ddl.</p> </li> <li> <p><strong> <code>truncate</code> jest minimalnie zalogowany </strong>, a nie w pełni zalogowany. co to znaczy? powiedzmy, że <code>truncate</code> stół. zamiast umieszczać każdy usunięty wiersz w dzienniku transakcji, <code>truncate</code> po prostu zaznacza strony danych, na których żyją, jako nieprzydzielone. właśnie dlatego jest tak szybki. dlatego też nie można odzyskać wierszy tabeli <code>truncate</code> z dziennika transakcji przy użyciu czytnika dziennika. znajdziesz tam tylko odniesienia do stron zwolnionych danych.</p> <p>porównaj to z <code>delete</code>. jeśli <code>delete</code> wszystkie wiersze w tabeli i zatwierdzisz transakcję, nadal teoretycznie możesz znaleźć usunięte wiersze w dzienniku transakcji i odzyskać je stamtąd. jest tak, ponieważ <code>delete</code> zapisuje każdy usunięty wiersz w dzienniku transakcji. w przypadku dużych tabel spowoduje to, że będzie on znacznie wolniejszy niż <code>truncate</code>.</p> </li> </ul><h1> <a href="http://msdn.microsoft.com/en-us/library/ms173790.aspx"> upuść </a> jest równie szybki jak truncate.</h1><ul> <li>podobnie jak <code>truncate</code>, <strong> <code>drop</code> jest operacją minimalnie rejestrowaną. </strong> oznacza to, że <code>drop</code> można wycofać też. oznacza to również <a href="http://msdn.microsoft.com/en-us/library/dd425070.aspx">działa dokładnie tak samo</a> jak <code>truncate</code>. zamiast usuwać poszczególne wiersze, <strong> <code>drop</code> oznacza odpowiednie strony danych jako nieprzydzielone i dodatkowo oznacza metadane tabeli jako usunięte </strong>.</li> <li> <p>ponieważ <code>truncate</code> i <code>drop</code> działają dokładnie w ten sam sposób, działają tak samo szybko. <strong> nie ma sensu <code>truncate</code> - przechodzenie do tabeli przed <code>drop</code> - pisanie jej. </strong> uruchom <a href="https://gist.github.com/1349319">this skrypt demo</a> w twojej instancji programistycznej, jeśli mi nie wierzysz.</p> <p>na mojej lokalnej maszynie z ciepłą pamięcią podręczną wyniki są następujące:</p> <pre><code>table row count: 134,217,728 run# transaction duration (ms) truncate truncate then drop drop  01 0 1 4 02 0 39 1 03 0 1 1 04 0 2 1 05 0 1 1 06 0 25 1 07 0 1 1 08 0 1 1 09 0 1 1 10 0 12 1  avg 0 8.4 1.3 </code></pre> <p>tak więc, dla tabeli 134 <em>milionów</em> wierszy, zarówno <code>drop</code>, jak i <code>truncate</code> nie zajmują w ogóle czasu. (w przypadku zimnego bufora zajmują około 2-3 sekund dla pierwszego uruchomienia lub dwóch). uważam również, że wyższy średni czas trwania operacji <code>truncate</code>, a następnie <code>drop</code>, można przypisać zmianom obciążenia na moja lokalna maszyna i <em>nie</em>, ponieważ kombinacja jest w magiczny sposób o rząd wielkości gorsza niż poszczególne operacje. w końcu są prawie dokładnie tym samym.</p> <p>jeśli interesują cię bardziej szczegółowe informacje na temat narzutu związanego z logowaniem tych operacji, <a href="https://dba.stackexchange.com/questions/4163/why-use-both-truncate-and-drop/7685#7685">martin ma proste wyjaśnienie</a> tego.</p> </li> </ul> <p>użycie sql server profiler (narzędzie gui) do śledzenia serwera produkcyjnego nie jest dobrym pomysłem. ale to zależy od obciążenia. zamiast tego należy używać śledzenia sql po stronie serwera (patrz <a href="http://msdn.microsoft.com/en-us/library/ms188662%28v=sql.100%29.aspx">sp\_trace\_xxx</a> procedury). znalazłem również artykuły:</p><p> <a href="http://sqlblog.com/blogs/linchi\_shea/archive/2007/08/01/trace-profiler-test.aspx">wpływ na wydajność: śledzenie profilera vs. śledzenie sql po stronie serwera</a> ,</p><p> <a href="http://vyaskn.tripod.com/server\_side\_tracing\_in\_sql\_server.htm">automatyzacja śledzenia po stronie serwera w programie sql server</a> </p><p> <a href="http://weblogs.sqlteam.com/dang/archive/2007/12/16/avoid-causing-problems-with-profiler.aspx">nikaj powodowania problemów z profiler</a> </p><p>może będzie zainteresowany i przydatny.</p><p> <a href="http://msdn.microsoft.com/en-us/library/ms187023.aspx">rezerwuj online</a> mówi:</p><ul> <li>uruchom profiler zdalnie zamiast bezpośrednio na serwerze</li> <li>unikaj włączania zdarzeń, które występują często (np. zablokuj: nabyte), chyba że jest to absolutnie konieczne</li> <li>uwzględnij tylko potrzebne klasy zdarzeń</li> <li>określ filtry ograniczające, aby zmniejszyć liczbę zdarzeń</li> <li>unikaj zbędnych danych (np. sql: batchstarting i sql: batchcompleted)</li> <li>unikaj uruchamiania dużych śladów za pomocą profiler; zamiast tego rozważ śledzenie sql po stronie serwera</li> <li>ogranicz rozmiar pliku śledzenia po stronie serwera i zarządzaj wykorzystaniem miejsca</li> </ul>