1

データベースから生成されたエンティティを使用する ASP.NET MVC3 アプリケーションがあります。各エンティティには、 MetadataType属性を使用して各エンティティを多数の検証属性で装飾されたクラスに関連付ける個別の部分クラスもあります (以下を参照)。

[MetadataType(typeof(Drawing.Metadata))]
public partial class Drawing
{
    private sealed class Metadata
    {
        [Required]
        [StringLength(50, MinimumLength = 3, ErrorMessage = "Drawing numbers must be between {2} and {1} characters in length.")]
        [DisplayName("Drawing number")]
        public string Number { get; set; }

        [Required]
        [StringLength(255, MinimumLength = 3, ErrorMessage = "Drawing titles must be between {2} and {1} characters in length.")]
        public string Title { get; set; }
    }
}

私のコントローラーコードは次のようになります。

[HttpPost]
public ActionResult Create(Drawing drawing)
{
    if (ModelState.IsValid)
    {
        // Save to database here...
        return RedirectToAction("Index");
    }
    else
    {
        return View(drawing);
    }
}

Visual Studio テンプレートを使用してビューを作成し、エンティティを追加、編集、および削除しました (デザイナー コードは変更されていません)。

私が抱えている問題は、エンティティを作成するときに、クライアント側の検証が有効になっている場合にのみ検証が機能することです。クライアント側の検証をオフにすると、ModelState.IsValidは常に true を返し、インデックス ページに戻ります。

サーバー側の検証を Entity Framework エンティティと連携させる方法について、誰か提案を提供できますか?

アップデート:

この質問は私のものと似ているようです。この投稿の著者は問題を解決したようですが、問題をどのように修正したかについて言及するのは役に立たないほど省略されています...

4

2 に答える 2

1

この問題の別の解決策を見つけました。プロパティを nullable に設定したくなかったので、次を追加しました。

[DisplayFormat(ConvertEmptyStringToNull = false)]

次の注釈をモデル プロパティに追加すると、エラーも修正されます。

于 2012-08-05T13:29:37.733 に答える
1

さらに調査した結果、デフォルトのモデル バインダーがユーザー入力値 (この場合は Null) をエンティティ プロパティにバインドしようとしたときに、エンティティ クラス ( ObjectContextから継承) によってConstraintExceptionがスローされるために問題が発生しているようです。

これに対する2つの可能な解決策を見ることができます:

  1. データベース テーブルの制約を緩和します (これはしたくありません)。
  2. エンティティ フィールドを null 可能にします (エンティティ デザイナーを使用して、nullable プロパティを yes に設定します)。

2 番目のオプションを使用してテストしたところ、サーバー側の検証が期待どおりに機能することが確認できました。

この問題の解決策を調査しているときに、問題は非常に重いクラスである ObjectContext から継承するエンティティが原因であるという結論に達しました。コードファーストのアプローチを使用したチュートリアルをたくさん見つけました。この場合、エンティティ クラスは、はるかに軽量なDbContextから継承されるため、これは問題に対する 3 番目の解決策と見なすことができると思います。

于 2011-11-21T14:01:08.613 に答える