C# týden November Black Friday
Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Pouze tento týden sleva až 80 % na e-learning týkající se C#
Avatar
Peter Janičina:20. září 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. září 9:45
Avatar
Odpovídá na Peter Janičina
Tadeáš Burda :20. září 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. září 11:42
Nerozmýšlaj, ako ušetriť peniaze. Rozmýšlaj, ako ich zarobiť viac!
Avatar
Nahoru Odpovědět
20. září 11:43
Nerozmýšlaj, ako ušetriť peniaze. Rozmýšlaj, ako ich zarobiť viac!
Avatar
Odpovídá na Peter Janičina
Tadeáš Burda :20. září 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. září 11:59
Nerozmýšlaj, ako ušetriť peniaze. Rozmýšlaj, ako ich zarobiť viac!
Avatar
Peter Janičina:20. září 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. září 13:47
Avatar
Odpovídá na Peter Janičina
don.jarducius:20. září 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. září 15:37
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
Odpovídá na Peter Janičina
Tadeáš Burda :21. září 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. září 10:44
Nahoru Odpovědět
21. září 10:42
Nerozmýšlaj, ako ušetriť peniaze. Rozmýšlaj, ako ich zarobiť viac!
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na don.jarducius
Jaroslav Smrž:21. září 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. září 10:49
/* Life runs on code */
Avatar
Odpovídá na Jaroslav Smrž
Peter Janičina:21. září 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. září 11:49
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na Peter Janičina
Jaroslav Smrž:21. září 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. září 15:05
Nahoru Odpovědět
21. září 15:02
/* Life runs on code */
Avatar
Jaroslav Smrž
Redaktor
Avatar
Jaroslav Smrž:21. září 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. září 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.