2011-12-21 27 views
28

私のコードは以前から動作していました。私はこれが起こるために何をしたのか分からず、私はそれを修正するように見えません。私は人々がModelStateをリセットすると言うことを見てきました。 (ModelState.Clear();)しかし、それは助けになりませんでした。また、私はまだMVCをかなり新しくしていることには役立ちません。どんな助けもありがとう。ありがとう。'CategoryId'キーを持つViewDataアイテムは '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の場合、私のpopulateメソッドを実行して問題を修正しました。 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) 

を今すぐ別のフィールドの形でも掲示し、それぞれのモデルに区分を設定します。

関連する問題