NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Michal Štěpánek:17.4.2016 10:06

Ahoj, vytvořil jsem si WPF aplikaci na vyúčtování tel. hovorů u nás ve firmě. Pak mě napadlo, že bych mohl udělat jakousi nadstavbu ve formě webapp, aby se na své výpisy hovorů mohli podívat i ostatní uživatelé. Spáchal jsem tedy MVC aplikaci. Výpis hovorů je v kontroleru nastaven na minulý měsíc - to funguje dobře. Narazil jsem ale na problém, když jsem chtěl pomocí DropDownListu a TextBoxu umožnit výběr jiného období pro výpis.
Pohled

@{
        List<SelectListItem> mesic = new List<SelectListItem>();
        mesic.Add(new SelectListItem { Text = "Leden", Value = "1" });
        mesic.Add(new SelectListItem { Text = "Únor", Value = "2" });
        mesic.Add(new SelectListItem { Text = "Březen", Value = "3" });
        mesic.Add(new SelectListItem { Text = "Duben", Value = "4" });
        mesic.Add(new SelectListItem { Text = "Květen", Value = "5" });
        mesic.Add(new SelectListItem { Text = "Červen", Value = "6" });
        mesic.Add(new SelectListItem { Text = "Červenec", Value = "7" });
        mesic.Add(new SelectListItem { Text = "Srpen", Value = "8" });
        mesic.Add(new SelectListItem { Text = "Září", Value = "9" });
        mesic.Add(new SelectListItem { Text = "Říjen", Value = "10" });
        mesic.Add(new SelectListItem { Text = "Listopad", Value = "11" });
        mesic.Add(new SelectListItem { Text = "Prosinec", Value = "12" });
    }
    @Html.DropDownList("vybrMesíc", mesic, "Zvolte měsíc", new { @class = "form-control"})
    @Html.TextBox("vybrRok", "2016")
    <input type="submit" value="Zobrazit" class="btn btn-success" />

Controller pro první přístup (bez výběru období)

[Authorize]
        public ActionResult Index()
        {
            var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

            // Get the current logged in User and look up the user in ASP.NET Identity
            var currentUser = manager.FindById(User.Identity.GetUserId());
            int linka = int.Parse(currentUser.Linka);
            int mesic = DateTime.Now.AddMonths(-1).Month;
            int rok = DateTime.Now.AddMonths(-1).Year;
            var hovory = from h in db.Komplet
                         where h.Linka == linka &&
                         h.Datum.Value.Month == mesic &&
                         h.Datum.Value.Year == rok
                         orderby h.Datum
                         select h;
            return View(hovory.ToList());
        }

pak jsem si vytvořil v kontroleru další akci (pro výběr období)

[Authorize]
[HttpPost]
public ActionResult Index(int mesic, int rok)
{
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
    //mesic = int.Parse(Request.Form["vybrMesic"].ToString());
    //rok = int.Parse(Request.Form["vybrRok"].ToString());
    //ViewBag.Mesic = mesic;
    //ViewBag.Rok = rok;
    //přihlášený uživatel
    var currentUser = manager.FindById(User.Identity.GetUserId());
    int linka = int.Parse(currentUser.Linka);
    var hovory = from h in db.Komplet
                 where h.Linka == linka &&
                 h.Datum.Value.Month == mesic &&
                 h.Datum.Value.Year == rok
                 orderby h.Datum
                 select h;

    return View(hovory.ToList());
}

ovšem tady mi píše, že nezná parametry "mesic" a "rok" (resp. jsou null).Zkoušel jsem googlit, ale jsem z toho srnec, daněk, jelen a nějak neumím nalezené rady implementovat do mého projektu...
Jak bych měl předat hodnoty z DropDownListu a TextBoxu z pohledu do toho kontroleru, aby to fungovalo?
Dělám to úplně špatně, nebo jen něco přehlížím?

Editováno 17.4.2016 10:08
Odpovědět
17.4.2016 10:06
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
sadlomaslox25:17.4.2016 10:59

nejsem velky expert na MVC ale delam s WebApi a tam si nemuzes poslat 2 parametry pres post. Musis si udelat wrapper tridu a zabalit do ni ty 2 pozadavky.

 
Nahoru Odpovědět
17.4.2016 10:59
Avatar
Odpovídá na sadlomaslox25
Michal Štěpánek:17.4.2016 14:11

Mohl bys to prosím trošku upřesnit, nebo uvést nějaký příklad, abych to pochopil?

Nahoru Odpovědět
17.4.2016 14:11
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
sadlomaslox25:17.4.2016 15:10
[Authorize]
[HttpPost]
public ActionResult Index(int mesic, int rok)
{}

na

class DateWrapper
{
        public int mesic {get;set;}
        public int rok {get;set;}
}

[Authorize]
[HttpPost]
public ActionResult Index(DateWrapper date)
{}
 
Nahoru Odpovědět
17.4.2016 15:10
Avatar
Makaron
Člen
Avatar
Makaron:17.4.2016 16:21

Keď som robil s ASP.NET MVC, tak sa 2 post parametry dali v pohode posielať.

 
Nahoru Odpovědět
17.4.2016 16:21
Avatar
Odpovídá na Makaron
Michal Štěpánek:17.4.2016 16:44

Podle mě se to poslat dá, ale nevím, jak udělat, aby kontroler věděl, z čeho má ty hodnoty přečíst...

Nahoru Odpovědět
17.4.2016 16:44
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Makaron
Člen
Avatar
Odpovídá na Michal Štěpánek
Makaron:17.4.2016 16:54

Možno to bude blbosť, ale skús tie premenné nazvať rovnako ako dropdown a text box (vybrMesíc a vybrRok).

 
Nahoru Odpovědět
17.4.2016 16:54
Avatar
Odpovídá na Michal Štěpánek
sadlomaslox25:17.4.2016 17:14

vsude na netu pisou ze normalne nejde poslat vic parametru postem a musi se to nejak epicky hackovat aby to slo. takze to wrapni :)

 
Nahoru Odpovědět
17.4.2016 17:14
Avatar
Nahoru Odpovědět
17.4.2016 17:30
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na sadlomaslox25
Michal Štěpánek:17.4.2016 17:37

Tak jsem to zkusil, chybu to nehází, ale asi nevím jak nacpat hodnoty (value z DropDownListu a text z TextBoxu) do těch proměnných, protože mi to nic nenajde...

Nahoru Odpovědět
17.4.2016 17:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Makaron
Člen
Avatar
Odpovídá na sadlomaslox25
Makaron:17.4.2016 17:46

Ja som vo svojom minulom projekte cez post posielal objekt a ešte aj jeden int, a v pohode mi všetko šlapalo.

 
Nahoru Odpovědět
17.4.2016 17:46
Avatar
Odpovídá na Michal Štěpánek
sadlomaslox25:17.4.2016 18:04

jako ty zdroje se na netu lisi nekdo rika ze to de nekdo ze to nejde ale nejak nevidim jak mas definovany ten formular v tom html? na netu si tam vsichni nastavuji adresu a model ktery budou posilat do backendu.

 
Nahoru Odpovědět
17.4.2016 18:04
Avatar
JOF
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
JOF:17.4.2016 18:30

Není problém poslat více hodnot do kontroleru, problém bude spíš s názvy, případně s datovými typy těch parametrů. Názvy parametrů musí být stejné jako názvy těch komponent ve formuláři, což je v tvém případě "vybrMesíc" a "vybrRok" (pozor na tu diakritiku, tu bych tam rozhodně nedával). Co se týká datových typů, tak pokud textbox "vybrRok" není typu "number", může obsahovat libovolný řetězec a parametr v metodě Index by měl být spíše typu string.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
17.4.2016 18:30
Avatar
Odpovídá na JOF
Michal Štěpánek:17.4.2016 18:47

Jak prosté... Říkal jsem si, že by to mělo nějak takhle fungovat, jen jsem si neuvědomil ty rozdíly mezi názvem proměnných a názvy komponent. Ta diakritika se tam dostala omylem při jednom z mnoha zoufalých pokusů o rozchození... Díííííííííííí­ííííííííííííí­ííííííííííííí­ííííííííííííí­ííííííííííííí­ííííííííííííí­ííííííííííííí­ííííííííííííí­ííííky. :-D

Nahoru Odpovědět
17.4.2016 18:47
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Makaron
Člen
Avatar
Odpovídá na Michal Štěpánek
Makaron:17.4.2016 20:52

Ako keby som predtým nenapísal, aby si skúsil rovnaké mená :D

 
Nahoru Odpovědět
17.4.2016 20:52
Avatar
Odpovídá na sadlomaslox25
Marian Benčat:21.4.2016 0:12

Takhle je to skutecne od WebAPI2, kde lze v body mapovat pouze jednu hodnotu, zbytek musi byt v URI. Spravne by se to skutecne melo zabalit do entity.

U ASP MVC se vsak da mapovat vice hodnot bez problemu (dokonce jde pridat advanced zpusob bindovani pomoci model binderu).

Jak uz napsal JOF, je dulezite aby se jmenovaly stejne -> name musi odpovidat nazvu property.. pak se zkousi jestli je mozne hodnotu namapovat na konkretni datovy typ.

Nahoru Odpovědět
21.4.2016 0:12
Totalitní admini..
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 16 zpráv z 16.