2011-01-21 21 views
2

私はASP.NET MVC ModelState.IsValid doesntの仕事

[HttpPost] 
    public ActionResult Create(Topic topic) 
    { 
     if (ModelState.IsValid) 
     { 
      topicRepo.Add(topic); 
      topicRepo.Save(); 

      return RedirectToAction("Details", new { id = topic.ID }); 
     } 
     return View(topic); 
    } 

を作成するために、このコントローラのメソッドをしましたし、この編集

 [HttpPost] 
     public ActionResult Edit(int id, FormCollection formCollection) 
     { 
      Topic topic = topicRepo.getTopic(id); 
      if (ModelState.IsValid) 
      { 
       UpdateModel<Topic>(topic); 
       topicRepo.Save(); 
       return RedirectToAction("Details", new { id = topic.ID }); 
      } 
      return View(topic); 
     } 

用(た.ascx) 。私は、トピックを作成しようが、私はそれが普通です

答えて

8

に編集しようとすると動作しない場合

検証が動作します。最初の例では、アクションパラメータとしてモデルを使用しています。既定のモデルバインダーがこのモデルを要求からバインドしようとすると、自動的に検証が呼び出され、アクションを入力するとModelState.IsValidが既に割り当てられています。

2番目の例では、アクションはモデルを使用せず、キー/値のコレクションのみが使用され、モデルの検証は行われません。妥当性検査は、ModelState.IsValidの呼び出し後にを呼び出したUpdateModel<TModel>メソッドによってトリガーされます。

だから、あなたはこれを試みることができる:

[HttpPost] 
public ActionResult Edit(int id) 
{ 
    Topic topic = topicRepo.getTopic(id); 
    UpdateModel<Topic>(topic); 
    if (ModelState.IsValid) 
    { 
     topicRepo.Save(); 
     return RedirectToAction("Details", new { id = topic.ID }); 
    } 
    return View(topic); 
} 
+0

はありがとうございました! –

+1

FYI - ModelState.IsValidがfalseの場合、UpdateModelがスローされます。スローしたくない場合は、代わりにTryUpdateModelを使用してください。 – Levi

+1

エラーがある場合、戻り値View(トピック)は、フォームからの値ではなく、データベースからビューの値を返します。また、検証エラーは表示されません。 – jlp

関連する問題