1

プロジェクトでEF4.xセルフトラッキングエンティティを使用していて、MVC4 Webアプリケーションでモデル検証を実行しようとしていますが、モデル状態は常に有効であるように見えます。T4テンプレートを使用して「バディ」クラスを生成しています。以下は、STEの1つとその仲間の例です。

STE-T4を使用して生成:

[DataContract(IsReference = true)]
[KnownType(typeof(Filing))]
public partial class FilingHistory: IObjectWithChangeTracker, INotifyPropertyChanged
{
   public int FilingHistoryId 
   {
     //Snipped for Brevity
   }
   // Navigation, ChangeTracking, Association Fix up snipped
}

これは、私が書いたT4テンプレートを介して生成されたバディクラスです。

[MetadataType(typeof(FilingHistoryMetaData))]
public partial class FilingHistory
  {
    // Partial Class 
  }

public class FilingHistoryMetaData
{           
   [Display(Name = "Filing History Id")]
   [Required(ErrorMessage = "Filing History Id is Required.")]
   int FilingHistoryId { get; set; }    
   // Other properties snipped for Brevity
}

キーは自動的に作成されるため(fyiと同様)、各MetaDataクラスからキーを除外します。また、STE、空のパーシャル、およびバディクラスの名前空間は同一です。

テンプレートの作成を使用して、MVC4で単純なコントローラーを作成し、作成のHttpPostアクションでテストすると、次のようなコードが表示されます。

[HttpPost]
public ActionResult Create(FilingHistory filingHistoryToCreate)
 {
    if (ModelState.IsValid)  // THIS IS ALWAYS TRUE! even if i pass nothing<----
    {
            return Redirect("/");
    }

   return View(filingHistoryToCreate);
}

私はたくさんのSOリンクを読み、MSDNも調べましたが、すべてが正しくセットアップされていると思います。つまり、名前空間は問題ないので、裸の部分的なクラスの処理は行われていません。

ビューがレンダリングされたら、すべてのテキストボックスを空のままにします。エンティティごとに検査するブレークポイントを設定しましたが、何も設定されていませんが、モデルは有効です。また、テキストボックスにゴミを入力して、モデルのバインドが正常に機能していることを確認してテストしました。

コンソールアプリケーションを使用してテストも試みましたが、MetaDataタイプを登録するための追加の手順を実行する必要があることがわかりましたが、MVCではこれは必須ではないと考えています。誰かに役立つ場合は、コンソールアプリとメタデータ型の登録も機能しなかったので、私の仲間のクラスが原因である可能性があると思いますか?

4

1 に答える 1

2

属性をチェックするときにプロパティDataAnnotationsModelMetadataProviderを探しているようです。public

に変更するFilingHistoryIdpublic、機能するはずです。

public class FilingHistoryMetaData
{           
   [Display(Name = "Filing History Id")]
   [Required(ErrorMessage = "Filing History Id is Required.")]
   public int FilingHistoryId { get; set; }    
   // Other properties snipped for Brevity
}
于 2012-06-14T17:59:55.450 に答える