dimanche 9 août 2015

@Html.DropDownListFor not posting back to controller

I am using @Html.DropDownListFor first time. Code is below Model

class Student
{
    [Required]
        [Display(Name = "Name")]
        public string Name { get; set; }

[Required]
    [Display(Name = "Roll Number")]
    public string RollNumber { get; set; }

    [Required]
    [Display(Name = "ClassId")]
    public int ClassId { get; set; }

}

class Class
{
    [Required]
        [Display(Name = "ClassId")]
        public string RollNumber { get; set; }

    [Required]
        [Display(Name = "ClassName")]
        public string RollNumber { get; set; }
}

Controller

public ActionResult Create()
{
    Student student = new BusinessEntities.Student();
    List<Class> classes = GetAllClasses();
    ViewBag.ClassId = new SelectList(classes, "ClassId", "ClassName");
    return View(student);
}

[HttpPost]
public ActionResult Create(BusinessEntities.Student student)
{
   if (ModelState.IsValid)
   {
      //Integer has 0 by default. But in our case if it contains 0, 
      //means no class selected by user
      if(student.ClassId==0)
      {
        ModelState.AddModelError("ClassId", "Select Class to Enroll in");
        return View(student);
      }
    }
}

Student Create View

<form  method="post">
    Select Class : 
    @Html.DropDownListFor(Model=>Model.ClassId,ViewBag.ClassId as IEnumerable<SelectListItem>, "ClassId","ClassName")
    @Html.ValidationMessageFor(Model => Model.ClassId)
    <input type="submit" value="Submit" />
</form>

Error Message :

    The ViewData item that has the key 'ClassId' is of type
 'System.Collections.Generic.List`1[[BusinessEntities.Class, 
BusinessEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' 
but must be of type 'IEnumerable<SelectListItem>'.

I want ClassId of Student be binded and populated automatically when posted back to controller. Please help me to get rid of it. Thanks.

Aucun commentaire:

Enregistrer un commentaire