L'élément ViewData qui a la clé 'CategoryId' est de type 'System. Int32' mais doit être de type 'IEnumerable '?
, Donc mon code fonctionnait avant. Je ne sais pas ce que j'ai fait pour que cela se produise et je n'arrive pas à le réparer. J'ai vu des gens dire de réinitialiser le ModelState. (ModelState.Clear(); ) mais cela n'a pas aidé. En outre, cela n'aide pas que je sois encore assez nouveau sur MVC. Toute aide serait appréciée. Grâce.
Contrôleur:
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;
}
Vue:
<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>
Modèle:
public int CategoryId { get; set; }
public IEnumerable<SelectListItem> CategoryItems { get; set; }
2 réponses
Si votre ModelState N'est pas valide sur votre action POST, vous devez repeupler vos propriétés SelectList:
if( ModelState.IsValid )
{
// save and redirect
// ...
}
// repopulate your SelectList properties:
model.CategoryItems = GetCategories();
return View(model);
Ne repeuplez pas le modèle entier car sinon vous risquez de perdre les modifications apportées par l'utilisateur.
Une autre façon que j'ai trouvé la solution est de prendre un champ caché. donc dans votre cas vous pourriez faire comme ci-dessous:
@Html.HiddenFor(model => model.CategoryId)
Maintenant, avec un autre formulaire de champ, postez et définissez CategoryId dans le modèle respectif.