2015-08-09 5 views
2

Я использую @Html.DropDownListFor в первый раз. Код ниже.@ Html.DropDownListДля того, чтобы не отправлять обратно контроллеру

Модель:

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; } 
} 

Контроллер:

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); 
     } 
    } 
} 

Студент Создать вид:

<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> 

Сообщение об ошибке:

ViewData элемент, который имеет ключ 'Classid' имеет тип «System.Collections.Generic.List`1 [[BusinessEntities.Class, BusinessEntities, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] ', но должен иметь тип «IEnumerable».

Я хочу ClassId из Student быть переплетены и заполняется автоматически при вывешены назад к контроллеру. Пожалуйста, помогите мне избавиться от него. Спасибо.

+0

Какова ваша модель? –

ответ

2

Вы должны дать другое имя SelectList, что свойство вашего связывания (скажем)

ViewBag.ClassList = new SelectList(classes, "ClassId", "ClassName");` 

, а затем

@Html.DropDownListFor(m => m.ClassId, ViewBag.ClassList as IEnumerable<SelectListItem>) 

, а затем обеспечить, если Вы возвращаете вид (например, если ModelState недействителен), что вы повторно заполняете SelectList (как вы это делали в методе GET). В настоящее время, когда вы вернете вид, это null приводит к ошибке, потому что, если второй параметр null Запасной вариант является то, что помощник ожидает, что первый параметр будет IEnumerable<SelectListItem> (но его нет - его TypeOf int)

Боковые ноты : Не используйте Model => Model.XXX (капитал M) и ваше текущее использование DropDownistFor() как 2 параметра, которые не имеют смысла. "ClassId" добавит опцию метки <option value="">ClassId</option>, а последняя ,"ClassName" ничего не сделает.

Редактировать

Кроме того, ваш

if(student.ClassId==0) 
{ 
    ModelState.AddModelError("ClassId", "Select Class to Enroll in"); 
    return View(student); 
} 

немного бессмысленно. student.ClassId никогда не будет 0, если один из элементов вашего GetAllClasses() не имеет ClassId = 0. Вы должны использовать

[Required(ErrorMessage = "Select Class to Enroll in")] // add error message here 
public int ClassId { get; set; } 

и в представлении

@Html.DropDownListFor(m => m.ClassId, ViewBag.ClassList as IEnumerable<SelectListItem>, "--please select--") 

, который создаст первый вариант со значением null.Если этот параметр был выбран, то DefaultModelBinder попытается установить значение ClassId = null, которое не работает (поскольку тип int не может быть null) и добавлена ​​ошибка ModelState и ModelState становится недействительным.

ИН методом POST

[HttpPost] 
public ActionResult Create(BusinessEntities.Student student) 
{ 
    if (!ModelSTate.IsValid) 
    { 
    ViewBag.ClassList = // repopulate select list 
    return View(student); 
    } 
    // Save and redirect 
} 
+0

См. Также обновление относительно кода в методе POST –

Смежные вопросы