Body zdarma Java týden
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!
Avatar
Horas
Člen
Avatar
Horas:20.11.2018 12:35

Nejde mi při použití AJAX udržet obsah Session a vrátit požadované hodnoty.
Na jedné stránce mám seznam položek a zároveň košík. Chtěl bych pomocí AJAX přesouvat položky do košíku.

Zkusil jsem: Na pohledu mám u každé položky:
<button onclick="Add(id)">Při­dej</button >

Tlačítko volá fci:
function Add(id) {
$.ajax({
type: 'POST',
data: { 'id': id },
dataType: 'json',
url: '@Url.Action("Buy", "Cart")',
success: function (cart) {
tady chci vypisovat obsah košíku, ale nedostanu sem položky a vypisuje to chybu
}
});
}

V kontroleru mám:
public ActionResult Buy(int id)
{
EshopProductModel productModel = new EshopProductMo­del();
List<EshopItem> cart = new List<EshopItem>();

if (Session["cart"] == null)
{
cart.Add(new EshopItem { Product = productModel.fin­d(id), Quantity = 1 });
Session["cart"] = cart;
}
else
{
cart = (List<EshopItem>)Ses­sion["cart"];
int index = isExist(id);
if (index != -1)
{
cart[index].Qu­antity++;
}
else
{
cart.Add(new EshopItem { Product = productModel.fin­d(id), Quantity = 1 });
}
Session["cart"] = cart;
}
return Json(cart, JsonRequestBe­havior.AllowGet);
}

Po return v kontroleru to funguje dobře. Return vynuluje Session a vypisuje chybu:
Při serializaci objektu typu System.Data.En­tity.DynamicPro­xies.Product_A937DDFE­AE1517F1E89CA­DED98C4A9BC173F6C7DD0C32­897D56FF1E3FC97DA11 byl nalezen kruhový odkaz.

Zkoušel jsem:
return Json("aaa", JsonRequestBe­havior.AllowGet);

  • ten naplněnou Session nechává a chybu nevypisuje.
 
Odpovědět 20.11.2018 12:35
Avatar
Horas
Člen
Avatar
Horas:21.11.2018 8:34

Omlouvám se za špatně vložený kód. Upraveno pro lepší čtení:

Nejde mi při použití AJAX udržet obsah Session a vrátit požadované hodnoty.
Na jedné stránce mám seznam položek a zároveň košík. Chtěl bych pomocí AJAX přesouvat položky do košíku.

Zkusil jsem: Na pohledu mám u každé položky:

<button onclick="Add(id)">Přidej</button >

Tlačítko volá fci:

function Add(id) {
        $.ajax({
                type: 'POST',
                data: { 'id': id },
                dataType: 'json',
                url: '@Url.Action("Buy", "Cart")',
                success: function (cart) {
                                tady chci vypisovat obsah košíku, ale nedostanu sem položky a vypisuje to chybu
                }
        });
}

V kontroleru mám:

public ActionResult Buy(int id)
{
        EshopProductModel productModel = new EshopProductModel();
        List<EshopItem> cart = new List<EshopItem>();

        if (Session["cart"] == null)
        {
                cart.Add(new EshopItem { Product = productModel.find(id), Quantity = 1 });
                Session["cart"] = cart;
        }
        else
        {
                cart = (List<EshopItem>)Session["cart"];
                int index = isExist(id);
                if (index != -1)
                {
                        cart[index].Quantity++;
                }
                else
                {
                        cart.Add(new EshopItem { Product = productModel.find(id), Quantity = 1 });
                }
                Session["cart"] = cart;
        }
        return Json(cart, JsonRequestBehavior.AllowGet);
}

Po return v kontroleru to funguje dobře. Return vynuluje Session a vypisuje chybu:
Při serializaci objektu typu System.Data.En­tity.DynamicPro­xies.Product_A937DDFE­AE1517F1E89CA­DED98C4A9BC173F6C7DD0C32­897D56FF1E3FC97DA11 byl nalezen kruhový odkaz.

Zkoušel jsem:

return Json("aaa", JsonRequestBehavior.AllowGet);

ten naplněnou Session nechává a chybu nevypisuje, "aaa" předá do succes a lze ho vypsat.

Jak se zbavit chyby a předat data z kontroleru do pohledu?
Předem díky.

 
Nahoru Odpovědět 21.11.2018 8:34
Avatar
jozef_i
Člen
Avatar
jozef_i:21.11.2018 10:28

Nevidím do toho kódu tak hlboko, ale pravdepodobne bude problém pri priradení
Product=produc­tModel.find(id). Tam asi vzniká kruhový odkaz....

 
Nahoru Odpovědět 21.11.2018 10:28
Avatar
don.jarducius:21.11.2018 19:19

Ahoj,
hoď sem i třídu EshopProductModel, resp. co vrátí EshopProductMo­del.find(...), podle chyby to vypadá, že v tom co vrátí EshopProductMo­del.find(...) je odkaz na cart a začne se to točit dokola v serializaci.

Nahoru Odpovědět 21.11.2018 19:19
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Horas
Člen
Avatar
Odpovídá na don.jarducius
Horas:23.11.2018 17:08
public class EshopProductModel
   {
       public MenuDTBfirstEntities db = new MenuDTBfirstEntities();

       public goods find(string id)
       {
           return this.products.Single(p => p.id.Equals(id));
       }
   }

Nový poznatek: na SQL serveru jsem měl nějaké relace mezi tabulkami. Odstranil jsem je a vše začalo fungovat. Tam kde jsem je potřeboval v kódu jsem to upravil a vše jede. Nicméně mi není jasný, jak se s tím vypořádat, kdybych ty relace chtěl zachovat.

 
Nahoru Odpovědět 23.11.2018 17:08
Avatar
don.jarducius:23.11.2018 19:37

Myslím si, že v modelu vidím jednu výkonnostní chybku a to sice this.product.Single … id předpokládám máš primární klíč a tudíž tam nemůžou být 2 stejné, použij tedy First - první nalezený namísto Single - jediný nalezený, Single prohledá celá data, First najde 1. shodu a končí.

A teď řešení zacyklení serializace, vlastnosti, které nepotřebuješ serializovat nebo nechceš serializovat označ atributem [ScriptIgnore] nebo [JsonIgnore], podle toho, co používáš k serializaci viz. např. toto

Nahoru Odpovědět 23.11.2018 19:37
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na Horas
JOF:27.11.2018 21:40

Ahoj,

obecně bych ti doporučil neodesílat na klienta celé entity z EF. Vytvoř si vždy nějakou třídu s minimem potřebných informací a tu odesílej zpět.

 
Nahoru Odpovědět 27.11.2018 21:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.