newbie
3. 3. 2010 8:48:38
Príspevkov:
6
Článkov:
0
Blogy:
0
Správičiek:
0
Body:
30
Najaktívnejší č.:
135
|
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
Príspevkov:
1654
Článkov:
0
Blogy:
42
Správičiek:
162
Body:
13610
Najaktívnejší č.:
3
|
RE: Vymazavanie poloziek z kosika
|
|
Ahoj. Skus urobit zjednoduseny priklad a posli. Co je klucom v tom disctionary?
Tomáš Zeman, MCSD.NET
|
[Reakcia]
|
newbie
3. 3. 2010 11:15:06
Príspevkov:
6
Článkov:
0
Blogy:
0
Správičiek:
0
Body:
30
Najaktívnejší č.:
135
|
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
Príspevkov:
138
Článkov:
0
Blogy:
0
Správičiek:
0
Body:
690
Najaktívnejší č.:
22
|
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
Príspevkov:
6
Článkov:
0
Blogy:
0
Správičiek:
0
Body:
30
Najaktívnejší č.:
135
|
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
Príspevkov:
1654
Článkov:
0
Blogy:
42
Správičiek:
162
Body:
13610
Najaktívnejší č.:
3
|
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
|
[Reakcia]
|
newbie
3. 3. 2010 13:27:23
Príspevkov:
6
Článkov:
0
Blogy:
0
Správičiek:
0
Body:
30
Najaktívnejší č.:
135
|
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
Príspevkov:
1373
Článkov:
0
Blogy:
0
Správičiek:
1087
Body:
28605
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
Príspevkov:
429
Článkov:
5
Blogy:
26
Správičiek:
15
Body:
4045
Najaktívnejší č.:
4
|
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
Príspevkov:
1373
Článkov:
0
Blogy:
0
Správičiek:
1087
Body:
28605
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
Príspevkov:
6
Článkov:
0
Blogy:
0
Správičiek:
0
Body:
30
Najaktívnejší č.:
135
|
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
Príspevkov:
1654
Článkov:
0
Blogy:
42
Správičiek:
162
Body:
13610
Najaktívnejší č.:
3
|
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
|
[Reakcia]
|
Siro
3. 3. 2010 18:42:58
Príspevkov:
416
Článkov:
0
Blogy:
18
Správičiek:
24
Body:
3460
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
Príspevkov:
6
Článkov:
0
Blogy:
0
Správičiek:
0
Body:
30
Najaktívnejší č.:
135
|
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
Príspevkov:
1654
Článkov:
0
Blogy:
42
Správičiek:
162
Body:
13610
Najaktívnejší č.:
3
|
RE: Vymazavanie poloziek z kosika
|
@newbie: dokelu, to je znamy bug, mohlo ma to napadnut :-(
Tomáš Zeman, MCSD.NET
|
[Reakcia]
|