2

私はこのコントローラーの作成方法を持っています

[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) を使用します。

トピックを作成しようとすると検証が機能するが、編集しようとすると検証が機能しない

4

1 に答える 1

8

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

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

だからあなたはこれを試すことができます:

[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);
}
于 2011-01-21T15:25:56.183 に答える