newbie 3. 3. 2010 8:48:38 Body: 30 Najaktívnejší č.: 172 Vymazavanie poloziek z kosika Ahojte, mam implementovanu ASP.NET 2.0 web site, vramci ktorej pouzivam nakupny kosik. Na uchovavanie poloziek v kosiku je vyuzita funkcnost Profile-ov ASP.NET a serializujem polozky kosika ako binarne data. Tieto polozky su riesene ako kolekcia Dictionary<string, ShoppingCartItem>. Ako ulozisko profilov mam DB SQL 2000. A teraz k problemu :-) Stava sa, ze pri vlozeni novej polozky do kosika, je tato sice pridana, ale niektora z predchadzajucich z neho zmizne. Skumal som to, testoval a na nic neprisiel. Moze to byt nejakou chybou v serializacii toho kosika? Alebo zle pouzity typ collection? [Reakcia]
T 3. 3. 2010 10:55:54 Body: 16750 Najaktívnejší č.: 2 RE: Vymazavanie poloziek z kosika Ahoj. Skus urobit zjednoduseny priklad a posli. Co je klucom v tom disctionary? Tomáš Zeman, MCSD.NET, MCPD [Reakcia]
newbie 3. 3. 2010 11:15:06 Body: 30 Najaktívnejší č.: 172 RE: Vymazavanie poloziek z kosika Kod toho kosika vypada zjednodusene cca takto:[Serializable] public class ShoppingCartItem ...{ //Properties, Constructor }[Serializable] public class ShoppingCart ...{ private Dictionary<string, ShoppingCartItem> _items = new Dictionary<string, ShoppingCartItem>(); public ICollection Items ...{ get ...{ return _items.Values; } } public void InsertItem(string id, string title, decimal unitPrice) ...{ if (_items.ContainsKey(id)) _items[id].Quantity += 1; else _items.Add(id, new ShoppingCartItem(id, title, unitPrice)); } public void DeleteItem(string id) ...{ if (_items.ContainsKey(id)) ...{ _items.Remove(id); } } public void UpdateItemQuantity(string id, decimal quantity) ...{ if (_items.ContainsKey(id)) ...{ ShoppingCartItem item = _items[id]; item.Quantity = quantity; if (item.Quantity <= 0) _items.Remove(id); } } public void Clear() ...{ _items.Clear(); }}public class CurrentUserShoppingCart ...{ public static ICollection GetItems() ...{ return (HttpContext.Current.Profile as ProfileCommon).ShoppingCart.Items; } public static void DeleteItem(string id) ...{ (HttpContext.Current.Profile as ProfileCommon).ShoppingCart.DeleteItem(id); } public static void DeleteProduct(string id) ...{ (HttpContext.Current.Profile as ProfileCommon).ShoppingCart.DeleteProduct(id); } }Vo web config mam nastavene pre kosik a jeho uchovavanie v profile toto:<profile defaultProvider="ProfileProviderName"><providers><add name="ProfileProviderName" connectionStringName="ConnStringName" applicationName="AppName" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/></providers><properties> <add name="ShoppingCart" type="ShoppingCart" serializeAs="Binary" /></properties></profile>Klucom v Dictionary je id tovaru. [Reakcia]
Liero 3. 3. 2010 12:28:30 Body: 3800 Najaktívnejší č.: 8 RE: Vymazavanie poloziek z kosika Len niekolko poznamok: Namiesto ICollection ShoppingCart.Items je podla mna vyhodnejsie pouzit typ IEnumerable<ShoppingCartItem>, nemusis to potom pretypovavat. V metode UpdateItemQuantity overujes ci dany dany produkt existuje v kosiku. Ak neexsituje, tak by si mohol ason do Traceu vypusat chybu, alebo priamo userovi, lebo taka situacia by nemala nastat a ak nastane, tak treba upozornit, ze nieco je zle. Aky je rozdiel medzi DeleteItem a DeleteProduct? Co sa tyka miznutia tych poloziek, musis to nejako oddebugovat. Skus dat breakpoint niekde do pageinitu, skor ako sa cokolvek robi s kosikom v aktualnom requeste a pozri, ci ten item je tam. tak aspon zistis, ci mas chybu v business alebo datovej vrstve. [Reakcia]
newbie 3. 3. 2010 12:36:27 Body: 30 Najaktívnejší č.: 172 RE: Vymazavanie poloziek z kosika DeleteProduct robi takmer detto co DeleteItem - ibaze po jednom kuse - cize odoberie jeden kus daneho tovaru. Som pre nu zabudol nakopirovat do class-u ShoppingCart zodpovedajucu metodu. Debug je trochu problem - je to v produkcnom prostredi a tam to nefunguje korektne. V testovacom u mna to ide koser... [Reakcia]
T 3. 3. 2010 12:49:27 Body: 16750 Najaktívnejší č.: 2 RE: Vymazavanie poloziek z kosika @newbie: nevies poslat nejaky uplne chodivy zjednoduseny priklad? Tu nejaky ocividny problem nevidim, moze to byt sposobene v praci s API z vonka. Ako casto sa Ti to stava? Stava sa Ti to ked to mas vystavene von? Tomáš Zeman, MCSD.NET, MCPD [Reakcia]
newbie 3. 3. 2010 13:27:23 Body: 30 Najaktívnejší č.: 172 RE: Vymazavanie poloziek z kosika Nuze stava sa to na prvy pohlad uplne nahodne. Priklad: Nasekam si do kosika 20 produktov v presne definovanom poradi a vsetko prejde ok. Skusim tych istych 20 produktov v tom istom poradi a jeden z nich tam po dokonceni pokusu chyba. Uplne chodive to asi nebude - ale posielam kod pre grid a obsluhu udalosti zo stranky.<asp:GridView ID="gvwProducts" runat="server" AllowPaging="True" AutoGenerateColumns="False" DataKeyNames="ID" DataSourceID="objProducts" AllowSorting="True" OnRowCommand="gvwProducts_RowCommand" OnRowDataBound="gvwProducts_RowDataBound" EmptyDataText="V zvolenej kategórii sa nenachádzajú žiadne produkty." meta:resourcekey="gvwProductsResource1" EnableViewState="true" > <Columns> <asp:BoundField DataField="ID" Visible="false" meta:resourcekey="BoundFieldResource1" /> <asp:ImageField DataImageUrlField="SmallImageURL" ControlStyle-BorderWidth="1px" ItemStyle-Width="100px" meta:resourcekey="ImageFieldResource1" > <ItemStyle Width="100px"></ItemStyle> </asp:ImageField> <asp:HyperLinkField HeaderText="Produkt" SortExpression="Title" HeaderStyle-HorizontalAlign="Left" DataTextField="Name" DataNavigateUrlFormatString="~/ShowProduct.aspx?ID={0}" DataNavigateUrlFields="ID" meta:resourcekey="HyperLinkFieldResource1" ><HeaderStyle HorizontalAlign="Left"></HeaderStyle> </asp:HyperLinkField> <asp:TemplateField HeaderText="Jednotková cena s DPH" SortExpression="UnitPriceIncludingVAT" HeaderStyle-HorizontalAlign="Right" meta:resourcekey="TemplateFieldResource2"> <ItemTemplate> <div style="text-align: right"> <asp:Label runat="server" ID="UnitPriceIncludingVAT" Text='<%# (this.Page as BasePage).FormatPrice(Eval("UnitPriceIncludingVAT"))%>' ></asp:Label> </div> </ItemTemplate> <HeaderStyle HorizontalAlign="Right"></HeaderStyle> </asp:TemplateField> <asp:ButtonField ButtonType="Image" ImageUrl="~/Images/ShoppingCart.gif" CommandName="Add" Text="Pridať do košíka" ItemStyle-HorizontalAlign="Right" meta:resourcekey="ButtonFieldResource1" ><ItemStyle HorizontalAlign="Right"></ItemStyle> </asp:ButtonField> </Columns> <EmptyDataTemplate><b> <asp:Localize ID="locNoProducts" runat="server" meta:resourcekey="locNoProductsResource1" Text="Nie sú k dispozícii žiadne produkty."></asp:Localize></b></EmptyDataTemplate> </asp:GridView><asp:ObjectDataSource ID="objProducts" runat="server" SortParameterName="sortExpression" SelectMethod="GetProducts" SelectCountMethod="GetProductCount" EnablePaging="True" TypeName="Product"> <SelectParameters> <asp:ControlParameter ControlID="hdnSelectedCategory" Name="categoryID" PropertyName="Value" Type="String" /> </SelectParameters></asp:ObjectDataSource>protected void gvwProducts_RowCommand(object sender, GridViewCommandEventArgs e) ...{ if (e.CommandName == "Add") ...{ int rowIndex = Convert.ToInt32(e.CommandArgument); GridViewRow row = gvwProducts.Rows[rowIndex]; Product prod = Product.GetProductByID(gvwProducts.DataKeys[rowIndex].Value.ToString()); this.Profile.ShoppingCart.InsertItem(prod.ID, prod.Name, prod.UnitPriceIncludingVAT); } } [Reakcia]
vlko 3. 3. 2010 13:48:15 Body: 35145 Najaktívnejší č.: 1 RE: Vymazavanie poloziek z kosika Ja vidim skor problem v tom, ze dictionary nie je serializovatelny, takze by som odporucal nahradit ho pomocou ListDictionary a potom sa pozriet na to ako to pobezi. [Reakcia]
duracellko 3. 3. 2010 15:13:04 Body: 4745 Najaktívnejší č.: 7 RE: Vymazavanie poloziek z kosika @vlko.. preco by Dictionary nebol serializovatelny. @newbie.. pokial to robi nahodne, tak prve co ma napadlo: nebezi to na web farme? neviem ci SqlProfileProvider je spraveny tak, aby bezal na web farme. [Reakcia]
vlko 3. 3. 2010 15:23:34 Body: 35145 Najaktívnejší č.: 1 RE: Vymazavanie poloziek z kosika to duracellko: dictionary sa nevie serializovat cez XmlSerializer, tak preto ten napad [Reakcia]
newbie 3. 3. 2010 17:50:26 Body: 30 Najaktívnejší č.: 172 RE: Vymazavanie poloziek z kosika to duracelko: pokial sa web farmou rozumie aj oddelenie aplikacie od databazy, tak ano - DB je na jednom serveri a aplikacia na druhom to vlko: serializuje sa to binarne, takze s tym by dictionary nemalo mat problem [Reakcia]
T 3. 3. 2010 18:32:51 Body: 16750 Najaktívnejší č.: 2 RE: Vymazavanie poloziek z kosika @newbie: Hmmm...je to divne, nejake posuvanie indexov(prvy load -> akcia -> exekutnutie akcie) v gride nevyzera byt problem.(tipoval som to tak) Update panel nepouzivas? Nemozes dat aj code behind? Nemozes to dat do samostatneho projektu a poslat chodive ... len klucove veci, nech si to mozeme poriadne pozriet? Tomáš Zeman, MCSD.NET, MCPD [Reakcia]
Siro 3. 3. 2010 18:42:58 Body: 5205 Najaktívnejší č.: 6 RE: Vymazavanie poloziek z kosika To sú tie problémy s MS a inými cudzími komponentami. Čo si človek nenapíše to nemá, a potom bude ladiť, hľadať všetko milión krát a aj tak nič nenájde. Š#iro [Reakcia]
newbie 12. 3. 2010 7:13:07 Body: 30 Najaktívnejší č.: 172 RE: Vymazavanie poloziek z kosika Nuze zda sa ze je to vyriesene. Sposobovala to zda sa implementacia GridView prvku, kde bolo tlacidlo na pridavanie do kosika urobene ako ButtonField typu Image. BUG v ASP.NET 2.0 sposoboval ze po kliknuti sa dany event spustil 2krat po sebe. Nahradil som toto pomocou TemplateField-u a samotne tlacidlo som v ramci toho urobil ako ImageButton a zda sa ze funguje korektne. [Reakcia]
T 12. 3. 2010 11:14:28 Body: 16750 Najaktívnejší č.: 2 RE: Vymazavanie poloziek z kosika @newbie: dokelu, to je znamy bug, mohlo ma to napadnut :-( Tomáš Zeman, MCSD.NET, MCPD [Reakcia]