2011-12-21 2 views
28

Так что мой код работал раньше. Я не знаю, что я сделал для этого, и я не могу это исправить. Я видел, как люди говорят, чтобы сбросить ModelState. (ModelState.Clear();) Но это не помогло. Кроме того, это не помогает, что я все еще довольно новичок в MVC. Любая помощь будет оценена по достоинству. Благодарю.Элемент ViewData, который имеет ключ «CategoryId», имеет тип «System.Int32», но должен иметь тип «IEnumerable <SelectListItem>»?

Контроллер:

public ActionResult Create() 
    { 
     ActiveDirectoryModel adm = new ActiveDirectoryModel(); 
     ViewBag.notifyto = adm.FetchContacts(); 
     var model = Populate(); 


     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Create(CreateViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      model.leaf.Date = DateTime.Now.Date; 
      model.leaf.Category = model.CategoryId; 
      model.leaf.SubCategory = model.SubCategoryId; 
      model.leaf.AssignedTo = model.AssignedToId; 
      model.leaf.CoAssignedTo = model.CoAssignedToId; 
      model.leaf.Status = model.StatusId; 
      model.leaf.Priority = model.PriorityId; 
      //model.lead.Parent = model.ParentID; 

      db.LeafItems.AddObject(model.leaf); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(model); 
    } 

    public CreateViewModel Populate() 
    { 
     ActiveDirectoryModel adm = new ActiveDirectoryModel(); 
     var model = new CreateViewModel 
     { 
      AssignedToItems = adm.FetchContacts(), 
      CoAssignedToItems = adm.FetchContacts(), 
      NotifyToItems = adm.FetchContacts(), 
      CategoryItems = 
       from c in new IntraEntities().CategoryItems.ToList() 
       select new SelectListItem 
       { 
        Text = c.Name, 
        Value = c.ID.ToString() 
       }, 
      SubCategoryItems = 
       from sc in new IntraEntities().SubCategoryItems.ToList() 
       select new SelectListItem 
       { 
        Text = sc.Name, 
        Value = sc.ID.ToString() 
       }, 
      StatusItems = 
       from s in new IntraEntities().StatusItems.ToList() 
       where s.IsPriority == false 
       select new SelectListItem 
       { 
        Text = s.Name, 
        Value = s.ID.ToString() 
       }, 
      PriorityItems = 
       from p in new IntraEntities().StatusItems.ToList() 
       where p.IsPriority == true 
       select new SelectListItem 
       { 
        Text = p.Name, 
        Value = p.ID.ToString() 
       } 
     }; 
     return model; 
    } 

Вид:

<div class="createTopInner"> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.leaf.Category) 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(model => model.CategoryId, Model.CategoryItems, "") 
     @Html.ValidationMessageFor(model => model.leaf.Category) 
    </div> 
</div> 

Модель:

public int CategoryId { get; set; } 
    public IEnumerable<SelectListItem> CategoryItems { get; set; } 
+1

Я исправил проблему, выполнив мой метод заполнения, если ModelState.IsValid = false. После 8 часов я могу опубликовать это как реальный ответ. Я просто не хочу, чтобы кто-то терял время до тех пор. – Ber53rker

ответ

51

Если ModelState не действует на ваши действия POST, вы должны заселить свои свойства SelectList:

if(ModelState.IsValid) 
{ 
    // save and redirect 
    // ... 
} 

// repopulate your SelectList properties: 
model.CategoryItems = GetCategories(); 

return View(model); 

Не заменяйте всю модель, потому что в противном случае вы можете потерять любые изменения, внесенные пользователем.

+0

Спасибо. Это сохраняет ценности все еще. Но ваше решение, очевидно, является более безопасным маршрутом. – Ber53rker

+0

@ Dismissile вы можете предоставить дополнительную информацию об этом. Почему нам нужно повторно заполнить список выбора и есть ли побочный эффект. Спасибо –

+1

@AvneeshSrivastava MVC не имеет гражданства. Когда вы выполняете POST, он собирается повторно отобразить весь вид и все данные, которые у вас были до того, как они не будут отправлены в POST, будут потеряны. Когда вы отправляете форму, вы отправляете только выбранное значение, а не весь список элементов. Вам нужно повторно заполнить его, чтобы он снова имел полный список. – Dismissile

0

другой способ, я нашел решение, занимает скрытое поле. так что в вашем случае вы могли бы сделать, как показано ниже:

@Html.HiddenFor(model => model.CategoryId) 

Теперь с другой формой поля также разместить и установить CategoryId в соответствующей модели.

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

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