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 MVC - jak přiřadit ID budovy pomocí DropDownListu k uživateli?

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

Aktivity
Avatar
Michal Štěpánek:3.5.2016 15:19

Ahoj, pokouším se do tabulky AspNetUsers přiřadit ID budovy k uživateli. Dostal jsem se do stádia, kdy se mi v Register.cshtml v DropDownListu zobrazují jednotlivé budovy, ale při pokusu o uložení mi to hází chybu, že "položka musí být typu IEnumerable<Se­lectListItem>".
AccountViewModel

public class RegisterViewModel
    {

        [Required]
        [EmailAddress]
        [Display(Name = "E-mail")]
        public string Email { get; set; }

        [Required]
        [Display(Name = "Jméno")]
        public string FirstName { get; set; }

        [Required]
        [Display(Name = "Příjmení")]
        public string LastName { get; set; }

        [Required(ErrorMessage = "Budova musí být vybrána")]
        [Display(Name = "Budova")]
        [Range(4,5, ErrorMessage = "Budova musí být vybrána")]
        //public virtual Building BuildingId { get; set; }        (1)
        //public virtual int BuildingId { get; set; }           (2)
        public virtual List<Building> BuildingId { get; set; } //(3)
        //public IEnumerable<Building> BuildingId { get; set; } (4)

        [Required]
        [StringLength(100, ErrorMessage = "{0} musí obsahovat alespoň {2} znaků.", MinimumLength = 5)]
        [DataType(DataType.Password)]
        [Display(Name = "Heslo")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Potvrzení hesla")]
        [Compare("Password", ErrorMessage = "Heslo a potvrzení hesla se neshodují.")]
        public string ConfirmPassword { get; set; }
    }

AccounController

//
        // GET: /Account/Register
        [AllowAnonymous]
        public ActionResult Register()
        {
            ViewBag.BuildingId = new SelectList(db.Buildings.ToList());
            return View();
        }

        //
        // POST: /Account/Register
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email, BuildingId = Convert.ToInt32(model.BuildingId), FirstName = model.FirstName, LastName = model.LastName };
                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

                    // Další informace o povolení potvrzení účtu a resetování hesla naleznete na webu http://go.microsoft.com/fwlink/?LinkID=320771.
                    // Odeslat e-mail s tímto odkazem
                    // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    // await UserManager.SendEmailAsync(user.Id, "Potvrdit účet", "Potvrďte svůj účet kliknutím <a href=\"" + callbackUrl + "\">sem</a>");

                    return RedirectToAction("Index", "Home");
                }
                AddErrors(result);
            }

            // Pokud jsme došli až sem, pak něco selhalo a je třeba znovu zobrazit formulář.
            return View(model);
        }

a v Register.cshtml

...
<div class="form-group">
        @Html.LabelFor(m => m.BuildingId, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.DropDownList("BuildingId", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(m => m.BuildingId, "", new { @class = "text-danger"})
        </div>
    </div>
...

Hází mi to chyby
Když ve ViewModelu zvolím

  1. Neexistuje položka ViewData typu IEnumerable<Se­lectListItem> obsahující klíč BuildingId
  2. Položka třídy ViewData obsahující klíč BuildingId je typu System.Int32, ale musí být typu IEnumerable<Se­lectListItem>.
  3. a 4) Položka třídy ViewData obsahující klíč BuildingId je typu System.Collec­tions.Generic­.List`1[[MVCDDL_­Budovy.Models­.Building, MVCDDL_Budovy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nu­ll]], ale musí být typu IEnumerable<Se­lectListItem>.

Poradí mi prosím někdo, co dělám špatně?

Odpovědět
3.5.2016 15:19
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:3.5.2016 16:22

Zkus nejak takhle:

ViewBag.BuildingId = new SelectList(db.Buildings, "IdBudovy", "NazevBudovy");
Nahoru Odpovědět
3.5.2016 16:22
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Michal Štěpánek:3.5.2016 16:30

Stále stejné chyby...

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

jsem na mobilu, napisu pozdeji

Nahoru Odpovědět
3.5.2016 16:32
No hope, no future, JUST WAR!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:3.5.2016 23:33

Tak co? Porad to nemas vyresene? Jsem zde az nyni...

Nahoru Odpovědět
3.5.2016 23:33
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Michal Štěpánek:4.5.2016 0:03

Něco jsem našel na internetu, ale nic z toho se nezdařilo...

Nahoru Odpovědět
4.5.2016 0:03
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:4.5.2016 0:50

Takhle to mam ve view ja:

<div class="form-group">
            @Html.LabelFor(model => model.IdZanr, htmlAttributes: new { @class = "control-label col-md-2"})
            <div class="col-md-10">
                @Html.DropDownListFor(model => model.IdZanr, new SelectList(ViewBag.Genres, "Value", "Text"))
                @Html.ValidationMessageFor(model => model.IdZanr, "", new { @class = "text-danger" })
            </div>
        </div>
Nahoru Odpovědět
4.5.2016 0:50
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Michal Štěpánek:4.5.2016 7:20

A ve ViewModelu máš co?

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

Když to udělám takto, píše chybu:

DataBinding: System.Web.Mvc­.SelectListItem neobsahuje vlastnost daného názvu BuildingId.

Nahoru Odpovědět
4.5.2016 7:30
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:4.5.2016 10:33

V modelu mam

...
...
...
public int IdZanr {get;set}
public Zanr Zanr {get; set}
Nahoru Odpovědět
4.5.2016 10:33
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Michal Štěpánek:4.5.2016 10:49

Já su takové hňup, že to až bučí...
Nakonec jsem to po mnoha marných pokusech rozchodil. Když jsem to zkusil s tím DropDownListFor, psalo mi to

System.Web.Mvc­.SelectListItem neobsahuje vlastnost daného názvu BuildingId

i když netuším proč.
Do View jsem nakonec dal

@Html.DropDownList("BuildingId", null, "Budova", htmlAttributes: new { @class = "form-control" })

do ViewModelu

[Required(ErrorMessage = "Budova musí být vybrána")]
        [Display(Name = "Budova")]
        [Range(1, 55, ErrorMessage = "Budova musí být vybrána")]
        public int BuildingId { get; set; }
        //public IEnumerable<SelectListItem> Buildings { get; set; }
        public Building Buildings { get; set; }

fungovalo to i když jsem ve VievModelu prohodil

public IEnumerable<SelectListItem> Buildings { get; set; }
//public Building Buildings { get; set; }

jenže jsem já debil měl nastaveno ve ViewModelu

[Range(4, 5, ErrorMessage = "Budova musí být vybrána")]

abych vyzkoušel nutnost zvolení budovy a přitom jsem měl v DB jen 3 zkušení budovy - překvapivě to házelo chybu, když jsem vybral budovu 1 až 3...

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
4.5.2016 10:49
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na vajkuba1234
Michal Štěpánek:4.5.2016 10:54

Ale i tak, díky za snahu mi pomoci...
Hlavní problém byl v tom, že jsem si do ViewModelu dával celou dobu jen jednu položku k té budově a přitom jsem tam měl mít i "int" i "kolekci"

Editováno 4.5.2016 10:56
Nahoru Odpovědět
4.5.2016 10:54
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:4.5.2016 12:02

V pohode, to znam moc dobre, kdyz do neceho porad cumim a ono to nechce jit. Pak se na to vykaslu, kouknu na to znovu za nejakou dobu a ono to bylo uplne trivialni. :D

Nahoru Odpovědět
4.5.2016 12:02
No hope, no future, JUST WAR!
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 13 zpráv z 13.