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í.

Diskuze: ASP.NET Core zapamatavanie si hodnot

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Peter Janičina:20.9.2019 9:45

Caute, chcel by som, aby ked prepinam medzi view tak mi zapamatalo hodnoty co som zadal do kalkulacky.

Zkusil jsem: Skusal som to, ze v konstruktore vytvorim instancie a nie pri zobrazovani, preto to nefunguje lebo vytvori vzdy nove po kliku. Ale co som bol prekvapeni ze HomeController sa vytvra nova instancia tiez po kliku, preco?

Chci docílit: Chcem aby ked prepnem na scitanie alebo odcitanie aby mi zapamatalo ake cisla som uz zadal.
Prikladam priklad

public class Sucet
{
//[TempData]
[Display(Name = "1. číslo")]
[Range(1, 100, ErrorMessage = "Zadejte prosím číslo od 1 do 100.")]
public int Cislo1 { get; set; }

//[ViewData]
[Display(Name = "2. číslo")]
[Range(1, 100, ErrorMessage = "Zadejte prosím číslo od 1 do 100.")]
public int Cislo2 { get; set; }

public int Vysledok { get; set; }

public void Vypocet()
{
Vysledok = Cislo1 + Cislo2;
}

public void DruhaMocninaCis­la(int cislo)
{
Vysledok = cislo * cislo;
}
}

public class Minus
{
[Display(Name = "1. číslo")]
[Range(1, 100, ErrorMessage = "Zadejte prosím číslo od 1 do 100.")]
public int Cislo1 { get; set; }
[Display(Name = "2. číslo")]
[Range(1, 100, ErrorMessage = "Zadejte prosím číslo od 1 do 100.")]
public int Cislo2 { get; set; }
public int Vysledok { get; set; }

public void Vypocet()
{
Vysledok = Cislo1 - Cislo2;
}
}

public IActionResult Sucet()
{
Sucet sucet = new Sucet();

return View(sucet);
}

[HttpPost]
public IActionResult Sucet(Sucet sucet, string operacia)
{
if (ModelState.Is­Valid)
{
if (operacia == "Vypocitaj")
sucet.Vypocet();
else if (operacia == "2mocCisla1")
sucet.DruhaMoc­ninaCisla(sucet­.Cislo1);
else
sucet.DruhaMoc­ninaCisla(sucet­.Cislo2);
}

return View(sucet);
}

public IActionResult Minus()
{
Minus minus = new Minus();
return View(minus);
}

[HttpPost]
public IActionResult Minus(Minus minus)
{
if (ModelState.Is­Valid)
{
minus.Vypocet();
}

return View(minus);
}

 
Odpovědět
20.9.2019 9:45
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Peter Janičina
Tadeáš Burda :20.9.2019 11:42

Prečo si nevytvoríš jeden ViewModel pre všetky operácie a ten si nepredávaš? PS: Používaj tlačítko pre vkladanie kódu.

 
Nahoru Odpovědět
20.9.2019 11:42
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Peter Janičina
Tadeáš Burda :20.9.2019 11:59

ViewModel

    public class KalkulackaViewModel
    {
        public int Cislo1 { get; set; }
        public int Cislo2 { get; set; }
        public int Vysledek { get; private set; }

        public void Plus()
        {
            Vysledek = Cislo1 + Cislo2;
        }
        public void Minus()
        {
            Vysledek = Cislo1 - Cislo2;
        }
    }
}

View

@using Models
@model KalkulackaViewModel

<form method="post">
        <input asp-for="@Model.Cislo1"/>
        <input asp-for="@Model.Cislo2"/>
</form>
<p>@Model.Vysledek</p>

<a asp-action="Plus">Plus</a>
<a asp-action="Minus">MInus</a>

Controller

public IActionResult Index(KalkulackaViewModel model)
        {
            return View(model);
        }
        public IActionResult Plus(KalkulackaViewModel model)
        {
            if (ModelState.IsValid)
            {
                model.Plus();
                return RedirectToAction(nameof(Index), model);
            }
            return View(model);
        }

Napr.. Ale netestroval sem to...Tady je nato dost dobrý turotial, tak by sis to mnel asi pozornejsi precitat a zistis kde mas chybu ;)

 
Nahoru Odpovědět
20.9.2019 11:59
Avatar
Peter Janičina:20.9.2019 13:47

Presne tu kalkulacku som skusal a ja som to urobil nachval ze to mam rozdelne to je jedno ci by to bola kalkulacka alebo nejaky formular alebo tabulka, proste chcel by som docielit toho ze ked sa prepinas medzi view tak aby si zapamatalo to co som vyberal ci napisal, ked som na tom istom view talk samozrejme mi to zapamata ale ked sa prepnem tak uz nie, dovod je ze je v metode ktora sa vola tak vytvara sa nova instancia. Ked som to skusal dat do kontruktoru controlleru tak sa to vytvara opat.

 
Nahoru Odpovědět
20.9.2019 13:47
Avatar
Odpovídá na Peter Janičina
don.jarducius:20.9.2019 15:37

Úplně jsem nepochopil, co a v které fázi chceš ukládat...
Pokud chceš ukládat již provedené výpočty, použij sesstion, statickou proměnnou nebo databázi.
Pokud chceš ukládat co jsi zadal v prohlížeči ale ještě neodeslal ke "zpracování", použij localstorage, webstorage, cookies nebo ajax.

Snad se mě tě podařilo nasměrovat...

Nahoru Odpovědět
20.9.2019 15:37
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Peter Janičina
Tadeáš Burda :21.9.2019 10:42

Ak ta správne chápem tak chceš mat jeden ViewModel a ten posielať medzi viac View. Tak to neviem ci ide, lebo ak sa sa odkazes na niaky View, tak sa spusti jeho Get metoda. Ta ti vygeneruje novy ViewModel(mozes si to spravit sam a naplnit ho datamy) a pouzije ho pre View. No a ty potom vo View vlozis data do toho modelu a potom cez <input type="submint"/> ho odosles do Post metody pre ten View. Tam by si ho mohol poslat do dalsej Post metody pre ini View. No ale ak ti mas v tom View napr. <a> href="/.../Mi­nus>Mínus"<a> tak ten model sa neposle, lebo sa spusti Get metoda pre ten Mínus a ta vygeneruje novy ViewModel pre ten Mínus. Takze tie hodnoty si budes muset vzdy uložit niekde ked sa ti odosle ViewModel do Post metody pre ten View a naplnit si nový VIewModel ked sa ti spusti Get metoda pre ten nový View. Snad sem poradil.

Editováno 21.9.2019 10:44
 
Nahoru Odpovědět
21.9.2019 10:42
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na don.jarducius
Jaroslav Smrž:21.9.2019 10:49

V zásadě to můžeš "obejít" pomocí razor partial view. Dalším řešením je shared view a do něj vložíš jednotlivé další views, které potřebuješ. Vše pak budeš mít pod jedním kontrolerem i modelem.

Nahoru Odpovědět
21.9.2019 10:49
/* Life runs on code */
Avatar
Odpovídá na Jaroslav Smrž
Peter Janičina:21.9.2019 11:49

Este mam otazky, ok mal by som jeden kontroler a jeden model, v stadardnom vygenerovanom projekte ASP.NET Core MVC je tam _layout.cshtml _viewstart.cshtml index.cshtml. V tom layoute mam navigacnu listu kde si prepinam medzi pohladnmi a volaju sa GET metody. Kde by som mal zavolat ten spolocny model, teda kde ho vytvorit? A potom preco ked klikam na navigacnu listu a pozeram pohlady, tak sa mi vzdy vola konstruktor kontrolera? Myslel som, ze sa kontroler vytvara iba raz a nie vzdy po kliku na navigacnu listu. Chapem to zle, ze kotroleri sa vytvoria iba raz po celu dobu spustenia aplikacie, ak nie tak potom ako to funguje?

 
Nahoru Odpovědět
21.9.2019 11:49
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Peter Janičina
Jaroslav Smrž:21.9.2019 15:02

V podstatě rozdělíš controller na 2 části. Například:

public class KalkulackaController : Controller
{
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public IActionResult Index(KalkulackaViewModel kalkulackaViewModel)
        {
                if
                {
                        try
                        {
                        //tvuj kod
                        }
                        catch (Exception ex)
                        {
                                ModelState.Clear();
                                ViewBag.Message = $" Ooops! Někde máme problém... {ex.Message}";
                        }
                }
                return View();
        }
}

a do view si nahoru přidáš razor:

@model Kalkulacka.Models.KalkulackaViewModel

V podstatě rozdělíš view v controlleru na 2 části - když tam vstoupíš a když odešleš. Ta část když odešleš jen vypíše někam výsledek a kalkulačka tam stále bude připravená, jako když bys vstoupil na stránku poprvé.

V navigaci pak budeš přistupovat ke kalkulačce voláním controlleru kalkulacka, např:

<li class="nav-item">
        <a class="nav-link" asp-area="" asp-controller="Home" asp-action="Index">Home</a> </li>
<li class="nav-item">
        <a class="nav-link" asp-area="" asp-controller="Kalkulacka" asp-action="Index">Kalkulačka</a>
</li>
<li class="nav-item">
        <a class="nav-link" asp-area="" asp-controller="Home" asp-action="Index">Kontakt</a></li>

Snad ti toto pomůže

Editováno 21.9.2019 15:05
Nahoru Odpovědět
21.9.2019 15:02
/* Life runs on code */
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Jaroslav Smrž:21.9.2019 15:07

Omlouvám se za špatné formátování kódu, ale Visul Studio si to snad přebere :-)

Nahoru Odpovědět
21.9.2019 15:07
/* Life runs on code */
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 11 zpráv z 11.