Diskuze: ASP.NET MVC - předání parametru

C# .NET .NET (C# a Visual Basic) ASP.NET MVC - předání parametru American English version English version

Avatar
Michal Štěpánek:

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. dubna 10:08
Odpovědět 17. dubna 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:

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  -2 17. dubna 10:59
Avatar
Odpovídá na sadlomaslox25
Michal Štěpánek:

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

Nahoru Odpovědět 17. dubna 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:
[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. dubna 15:10
Avatar
Slavomir
Redaktor
Avatar
Slavomir:

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

 
Nahoru Odpovědět 17. dubna 16:21
Avatar
Odpovídá na Slavomir
Michal Štěpánek:

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. dubna 16:44
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Slavomir
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Slavomir:

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. dubna 16:54
Avatar
Odpovídá na Michal Štěpánek
sadlomaslox25:

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  -2 17. dubna 17:14
Avatar
Nahoru Odpovědět 17. dubna 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:

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. dubna 17:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Slavomir
Redaktor
Avatar
Odpovídá na sadlomaslox25
Slavomir:

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. dubna 17:46
Avatar
Odpovídá na Michal Štěpánek
sadlomaslox25:

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. dubna 18:04
Avatar
JOF
Tým ITnetwork
Avatar
Odpovídá na Michal Štěpánek
JOF:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 17. dubna 18:30
Avatar
Odpovídá na JOF
Michal Štěpánek:

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. dubna 18:47
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Slavomir
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Slavomir:

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

 
Nahoru Odpovědět 17. dubna 20:52
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na sadlomaslox25
Marian Benčat:

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. dubna 0:12
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.