そのため、私のコードは以前に機能していました。私はこれが起こるために何をしたのか分かりませんし、それを修正することはできません。 ModelStateをリセットすると言う人がいます。 (ModelState.Clear();)しかし、それは助けにはなりませんでした。また、MVCにまだかなり慣れていないのは役に立ちません。任意の助けをいただければ幸いです。ありがとう。
コントローラ:
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; }
ModelStateがPOSTアクションで無効な場合、SelectListプロパティを再設定する必要があります。
if( ModelState.IsValid )
{
// save and redirect
// ...
}
// repopulate your SelectList properties:
model.CategoryItems = GetCategories();
return View(model);
そうしないと、ユーザーが行った変更を失う可能性があるため、モデル全体を再作成しないでください。
私が解決策を見つける別の方法は、隠されたフィールドを取ることです。あなたの場合、次のようにすることができます:
@Html.HiddenFor(model => model.CategoryId)
また、別のフィールドフォームを使用して、それぞれのモデルでCategoryIdをポストおよび設定します。