IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.
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
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
Tvůrce
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.