0

Asp.NET MVCアプリケーションがあり、データ注釈を使用していくつかのフィールドに検証を追加しています。

    [Required]
    [DisplayName("Course Name")]
    string Name { get; set; }

しかし、これは私が期待したようには機能しないようです。基本的に、ページに手動でチェックして新しいRuleViolation()をスローする他のエラーが含まれている場合、必要な違反は検証の概要に表示されます。必要な違反が唯一のエラーである場合、それは表示されません。

私のコントローラーには次のコードが含まれています。

        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
            ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
            return View(courseViewModel);
        }

しかし、必要な違反がスローされていないことを考えると、私はここに入ることがありません。

DataAnnotation違反によって発生したエラーをトラップするために、私が知らないことをする必要がありますか?

助けてくれてありがとう

編集:

コントローラのアクションは次のとおりです。

    [HttpPost]
    [ValidateInput(true)]
    public ActionResult Edit(int id, CourseViewModel courseViewModel)
    {

        var oldCourse = _eCaddyRepository.GetCourse(id);

        if (courseViewModel.Course == null)
        {
            return View("NotFound", string.Format("Course {0} Not Found", id));
        }

        try
        {
            courseViewModel.Update(oldCourse);
            _eCaddyRepository.SubmitChanges();

            return RedirectToAction("Index", "Course");
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
            ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
            return View(courseViewModel);
        }
    }

更新はどこにありますか:

    public class CourseViewModel : BaseViewModel
{
    public Course Course { get; set; }

    public void Update(Course oldCourse)
    {
        oldCourse.Name = this.Course.Name != null ? this.Course.Name.Trim() : string.Empty;
        oldCourse.Postcode = this.Course.Postcode != null ? this.Course.Postcode.Trim() : string.Empty;

        for (var i = 0; i < 18; i++)
        {
            oldCourse.Holes[i].Par = this.Course.Holes[i].Par;
            oldCourse.Holes[i].StrokeIndex = this.Course.Holes[i].StrokeIndex;
        }
    }
}

編集:dataannotationsを使用して期待どおりに機能および検証する最終的なコード。マーレに感謝します。

    [HttpPost]
    [ValidateInput(true)]
    public ActionResult Edit(int id, CourseViewModel courseViewModel)
    {
        var oldCourse = _eCaddyRepository.GetCourse(id);

        if (courseViewModel.Course == null)
        {
            return View("NotFound", string.Format("Course {0} Not Found", id));
        }

        if (ModelState.IsValid)
        {
            try
            {
                courseViewModel.Update(oldCourse);
                _eCaddyRepository.SubmitChanges();
                return RedirectToAction("Index", "Course");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
        }

        // Return Model with errors
        ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
        return View(courseViewModel);
    }
4

3 に答える 3

3

他の誰もこれを指摘しなかったのだろうか(jfarは近かったが、彼の言い回しはオフだったので、chrisp_68はおそらくjfarがモデル状態違反で何を意味するのか理解していなかった)が、コントローラーからこれを見逃している:

        if (ModelState.IsValid) // this check for model validity, not try..catch block
        {
            // do your stuff here, update to the datastore and return another view
        }

        // you can add additional Model State errors here manually if you wish
        // with AddModelError() like you do it now
        return View(editing); // return the same view with errors

したがって、DataAnnotationsはそれ自体で例外スローを実行しないため、必要なのはModelState.IsValidチェックです。

編集:実際には、DataAnnotationsは例外スローを実行しません。例外スローを実行すると意味がなくなり、アプリの実行が中断されるためです。もちろん、これは望ましくありません。同じビューに戻り、ユーザーに間違いを修正する機会を与えたいと考えています。

一方、if(ModelState.IsValid)内にtry..catchブロックを設定して、ディスクへの書き込みの失敗、データベースへの保存の失敗、nullがないDB列へのnullの挿入などのREAL例外をキャッチすることもできます。許可など。

HTH

于 2010-07-25T15:40:40.117 に答える
1

[必須]フィールドが原因で例外をスローするMVC2には何もありません。

モデル状態違反が発生します、それだけです。「JoelAtwood」をDateTimeフィールドにバインドしようとしたときに、ModelBinderへの手動呼び出しからのみ例外がスローされることは間違いありません。

于 2010-07-24T15:11:15.840 に答える
0

クラスプロパティにデータアノテーションを配置します。名前空間は「YouProject.Model」である必要があります

于 2010-07-24T15:34:53.160 に答える