Avatar
Michal Štěpánek:

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. května 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:

Zkus nejak takhle:

ViewBag.BuildingId = new SelectList(db.Buildings, "IdBudovy", "NazevBudovy");
Nahoru Odpovědět 3. května 16:22
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Nahoru Odpovědět 3. května 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:

jsem na mobilu, napisu pozdeji

Nahoru Odpovědět 3. května 16:32
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Michal Štěpánek
vajkuba1234:

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

Nahoru Odpovědět 3. května 23:33
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovídá na vajkuba1234
Michal Štěpánek:

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

Nahoru Odpovědět 4. května 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:

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. května 0:50
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Nahoru Odpovědět 4. května 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:

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. května 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:

V modelu mam

...
...
...
public int IdZanr {get;set}
public Zanr Zanr {get; set}
Nahoru Odpovědět 4. května 10:33
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
Avatar
Odpovídá na vajkuba1234
Michal Štěpánek:

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. května 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:

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. května 10:56
Nahoru Odpovědět 4. května 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:

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. května 12:02
No hope, no future, JUST WAR! For world peace Israel must be DESTROYED!
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.