Viewstate a Updatepanel   otázka

ASP.NET WebForms

Zdravím všechny,

chtěl jsem se zeptat zda by mi někdo neporadil s Updatepanely.

Ve své aplikaci (ASP.NET(VB)) používám přehledových formulářů. Sloupce, a 100 řádků na stránku (Něco jako GridView), a po kliknutí na konkrétní záznam (řádek v GridView) se otevře nové okno s editačním formulářem, který reprezentuje pouze jeden konkrétní záznam v databázi. Mám ale od uživatelů požadavek, že by chtěli editovat záznamy už na úrovni přehledového formuláře.

Problém byl v tom, že na jednotlivá pole editačního formuláře se vázaly různé udásti, jako např. kontrola validity datumu, čísla, výběru z číselníku, a pod. Toto se mi částečně podařilo. Každý řádek je UpdatePanel, obsahující stená pole jako editační formulář, jen srovnané do tabulky. Sice to funguje, ale ne podle mých představ.

Problém je v tom, že mám dlouhou odezvu mezi tím co se požadavek odesílá na server a odpovědí(u výše uvedených polí, která mají nastaven autopostback uživatel vždy vidí 2 vteřiny jen "čekejte", a to mu práci bohužel neurychlí).

Podle mě je velkým problémem ViewState. Zdá se totiž, že 2. vteřinová prodleva se o něco více natahuje po každém PostBacku stránky.

Ale po vypnutí ViewState se mi vždy do výše uvedených polí vrátí původní hodnota. Rychlosti nepřidalo ani uložení ViewState mimo HTML.

Neměl by jste někdo nápad jak to vyřešit? Nebo zda něco nedělám špatně? Jsem vlastně ještě začátečník...

Pro úplnost pošlu ještě životní cyklus přehledového formuláře.

Page_Init: Dynamické vytvoření Updatepanelů, Controlů, Svázání Controlů s Handlery

Page_Load: Generování SQL Dotazu na základě uživatelem definovaných filtrů.

Pokud není PostBack tak:

Page_LoadComplete: Zavedení SQL dotazu naplnění controlů hodnotami z databáze.

Předem vám děkuji za pomoc, a omlouvám se že je to tak dlouhé... Petr

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na toto bych si skoro napsal vlastní komponentu,kterou bych podědil buďto od GridView nebo jiné komponenty.Takovou komponentu si pak můžete natemplatovat tak,aby při požadavku fungovala v edit modu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za Vaší reakci. Řádek tohoto přehledového formuláře je ručně napsaná třída, zděděná od třídy UpdatePanel, kterou si v Page_Init volám již společně s handlery. Přiznám se ale, že vůbec nevím, jak by se to dalo templatovat... ale nápad je to myslím dobrý. Když o tom tak přemýšlím, tak by to mohlo řešit mnoho jiných drobných problémů, které mám s tímto spojené, ale nevím, zda to bude řešit přímo tento zmiňovaný...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Do ViewState ukládejte jen to, co je nezbytné - pokud můžete data při každém postbacku načíst z databáze a neplácat je ve viewstate, udělejte to. Při prvním načtení stránky doporučuji plnit jen v PreRender (nebo LoadComplete), při postbacku pokud editujete řádek, musíte pravděpodobně původní data načíst v Init (před tím, než se natahuje viewstate a form post data) a pak načíst aktuální data znovu v PreRender (nebo LoadComplete). Takhle to dělají data sources a obejdete se bez ViewState.

Přes nástroj Fiddler se podívejte, co se na server posílá. Viewstate se vždy musí poslat celý, s tím nic neuděláte a platí - méně viewstate = kratší doba odesílání. Dávat ho mimo stránku se mi nelíbí z mnoha důvodů, ale může to být řešením.

Důležité je hlavně, co posílá server zpátky klientovi - UpdatePanel má standardně nastaveno UpdateMode na Always, což znamená, že se obsah updatepanelů posílá vždy (na klienta tedy přijde zpátky 100 řádků, i když se změnil jen jeden).

Změňte to na Conditional a aby se updatepanel opravdu updatoval, v code behindu na něm zavolejte Update, ale jen když se změní.

Jinak je i spousta jiných možností, jak provádět AJAXové operace, UpdatePanel se nehodí vždy. Dost často se používá přstup, že změny pošlete webové službě, ta pošle nějaký výsledek, a vy si stránku upravíte javascriptem - s jQuery je to dnes hračka. ViewState pak vůbec nepotřebujete (neděláte postbacky, nebo jen někdy a na něco, tam, kde se vám to hodí), ale jen si javascriptem zavoláte webovou službu a zaktualizujete změněnou část stránky. Není to o tolik méně práce a režie je tam daleko menší - je to ale zase víc práce.

ASP.NET WebForms mají zkrátka výhodu, že si můžete vybrat z několika přístupů, které jsou k dispozici, a to ten, který se hodí nejlépe v pohledu pracnost vs efektivita. Na druhou stranu je to i nevýhoda, musí se u toho myslet.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, děkuji Vám za velmi vyčerpávající, ale přínosnou odpověď.

Podařilo se mi již úplně vypnout Viewstate. Zatím na mě aplikace občas vyhodí chybu a ne všechny funkčnosti fungují jak předtím, ale to je podle mě jen o tom nyní přizpůsobit aplikaci a zdrojový kód tomu, že viewstate není.

Vytvořil jsem si vnější proměnnou "ExecuteSqlQuery As Boolean" která mi zajišťuje, že řádky jsou v Page_LoadComplete naplňovány daty z databáze jen tehdy, když je stránka poprvé načtena, pokud uživatel změní filtr sloupce, změní pořadí třídění řádků, nebo přepne na další (nebo předchozí) stránku.

Pokusil jsem se co nejvíce událostí objektů v řádcích přepsat do JavaScriptu a snížil tak počet PostBacků.

Dále jsem si do každého UpdatePanelu(řádku) vytvořil skrytý Checkbox který zaškrtnu javascriptem při události "OnKeyPress" na kterémkoli z objektů v updatepanelu. Tím jsem docílil toho, že handlery se mi při postbacku svážou pouze s objekty v UpdatePanelu, který má v checkbox.checked nastaven na true.

Tím vším jsem snížil čas odesílání a příjmu o polovinu, což není dokonalé, ale alespoň posun kupředu :-)

Jediné co jsem z Vaší odpovědi zatím nepochopil, je to využití webové služby. O něčem takovém jsem zatím neslyšel.

Jště jednou Vám děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vypínat ViewState globálně není zas ten nejlepší nápad - spousta "vestavěných" asp.net komponent má na ViewState postavenu funkcionalitu.Lepší je viewstate zakázat tam kde není třeba.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Od toho je v ASP.NET vlastnost ViewStateMode="Disabled" (od .NETu 4). Vypne ViewState kompletně a vy si jej můžete selektivně zapnout tam, kde je třeba. Na tomto přístupu není nic špatného, dokonce je to Microsoftem doporučovaný postup.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu ;-) Já jsem skončil u FW 3.5,kde tato možnost ještě nebyla a hrátky s viewstate se většinou(pokud člověk nevěděl co dělá) silně nevyplatily..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co se týče těch webových služeb, konkrétní návod máte zde:

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den, povedla se mi vytvořit jednoduchá služba ve VisualWebDeveloper, ale abych tomu rozuměl, spustil jsem IIS a v notepadu si napsal jednoduchou funkci Secti(a+b) a uložil na server jako test.asmx :

<%@ WebService Language="VB" Class="MojeSluzba" %>

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Data
Imports System.Data.SQLClient
Imports System.XML
Imports System.Web.Script.Services

<ScriptService()><WebService()> Public Class MojeSluzba
    Inherits System.Web.Services.WebService

    <WebMethod()> Public Function Secti(a As Integer, b As Integer) As Integer
        Return(a + b)
    End Function

End Class

Zkusil jsem soubor test.asmx zadat do prohlížeče, a otestoval si, že to funguje.

Pak jsem si v notepadu napsal uplně obyčejnou HTML stránku s objekty TextBox1, TextBox2 a Button1. Na netu jsem našel několik javascriptů, kterými bych mohl službu zavolat, předat jí proměnné a zobrazit výsledek. ale ať to zkouším jak to zkouším, stále se nic neděje...

Nevíte kde dělám chybu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Lepší by bylo ukázat ten javascript kterým se snažíte data tahat.samotná služby bude ok,pokud vám již předtím fungovala..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já jsem ale vů??. Taková hloupost... U Buttonu1.OnClientClick jsem neměl "return false;" Teď už mi to běží. (a já nad tím špekuluju už druhý den)

<%@ Page Language="vb" Debug="true" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head runat="server">
    <script src="~/test.asmx/js" type="text/javascript">
    </script>
    <script type="text/javascript">
        function sectiAaB() 
        {
            var a = document.getElementById('TextBox1').value;
            var b = document.getElementById('TextBox2').value;
            MojeSluzba.Secti(a, b, vysledekAaB);
        };
 
        function vysledekAaB(x) 
        {
            alert(x.toString());
        };
    </script>
  </head>
  <body runat="server">
    <form id="Form1" runat="server">
      <asp:ScriptManager id="ScriptManager1" runat="server">
        <Services>
           <asp:ServiceReference Path="~/test.asmx" />
        </Services>
      </asp:ScriptManager>
      <asp:TextBox id="TextBox1" runat="server"/>
      <asp:TextBox id="TextBox2" runat="server"/>
      <asp:Button id="Button1" runat="server" text="Sečti" OnClientClick="sectiAaB(); return false;" />
    </form>
  </body>
</html>

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback