2017-01-03 15 views
0

私はMVCアプリケーションを作成しています。 1つのビューにはフォームが含まれています。それを埋めると、フォームが検証され、モデルが有効な場合は別のウィンドウに移動する必要がありますが、そうでない場合は何も起こりませんが、データの一部が失われているようです。私のコントローラ:MVC null例外

public ActionResult PickGroupForHomework(PickGroupForHomeworkViewModel model) 
     { 
      ClassDeclarationsDBEntities2 entities = new ClassDeclarationsDBEntities2(); 
      model.groups = entities.Groups.ToList(); 
      model.users = entities.Users.ToList(); 
      int id = model.subject_id; 
      var subj = entities.Subjects 
        .Where(b => b.class_id == id) 
        .FirstOrDefault(); 
      model.subject_name = subj.name; 
      if (ModelState.IsValid) 
      { 

      } 
      else 
      { 

       if (subj != null) 
       { 
        model.subject_name = subj.name; 
       } 
       model.subject_id = model.subject_id; 
       model.groups = entities.Groups.ToList(); 
       model.users = entities.Users.ToList(); 
       return View(model); 
      } 
      return View(model); 

     } 

、明らかsubject_idqtyは偽の検証の後にNULLです。どうして?

+0

デバッガでそれを実行してください。私の推測は、 'model.subject_name = subj.name;'を実行したときに 'subj'がnullになる可能性があるためです。つまり、コードをきれいにするためにいくつかの方法があります(例えば 'model.subject_id = model.subject_id'?) –

+1

アクションの引数として渡されたコントローラ内のデータを変更する場合は、 ModelState.Clear()が必要ですこれはバインディングの問題です。 – kblau

+0

あなたが何を意味しているのか理解できません。また、偽の検証の後、subject_idとqtyがnullであるようです。 – Steve

答えて

2

モデル内のSubject_Idプロパティにバインドされたフィールドまたは非表示のフィールドがビューにありますか?厳密に型指定されたビューのモデルのプロパティにバインドされた隠しフィールドがない場合は、ユーザーがフォームを投稿してコントローラが呼び出されると、このデータは失われます。

@Html.HiddenFor(m => m.Subject_Id)