2011-07-21 7 views
1

ASP.NET MVCで開始されたばかりで、コレクションにデータアノテーションを適用する際に問題があります。何か基本的なものが見つからないか、データアノテーションを使用したコレクションの妥当性確認

私は強く型付けされたビューに渡すこのViewModelにあります。いずれかの等級リスト内のオブジェクトの数は、将来的に一定のままであるので、私ができない場合、私は見当がつかない

public class AddCostingViewModel 
{ 
     [Required] 
     [Range(120,190)] 
     public int SomeValue {get; set;} 

     public List<Grade> Grades { get; set; } 
     public List<int> GradeValues { get; set; } 
} 

を"Grade1、Grade2"などを渡す - このようなリストを渡してcshtmlページを構築することは、常に可能なすべての成績を含むフォームを保有し、正しい値を返すようにする最も明白な方法のようです。

<tr> 
    @foreach (var g in Model.Grades) 
    { 
     <th>@g.GradeName</th> 
    } 
    </tr> 
    <tr> 

    @for (int i = 0; i < Model.Grades.Count(); i++) 
    { 
     <td> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.GradeValues[i]) 
      @Html.ValidationMessageFor(model => model.GradeValues[i]) 
     </div> 
     </td> 
    } 
    </tr> 

手近にすべての可能なグレードの値を編集するためのフィールドを含むテーブルを生成します。私のCSHTMLはこのような何かに見えます。しかし、これらを(上記のSomeValueのように)範囲に対して検証したいのですが、SomeValueを使ったように、リストの上にデータ注釈を追加すると動作しないようです。これが可能か、私のアプローチはまったく間違っていますか?

答えて

2

あなたのグレード値は単純なintではなく、いくつかのドメイン固有の制限があるintです。そのロジックの後、私は、

public class GradeValue 
    { 
     [Range(100, 200)] 
     public int Value { get; set; } 
    } 

そして、あなたのモデルにグレード値のリストを記述するプロパティをグレード値を保持するための新しいクラスを設計します、

public List<GradeValue> GradeValues { get; set; } 

だろうと検証は、すべてにランデ適用されますあなたのviewModelのGradeValue。また、1行のコードを変更する必要はありません。さらに、より簡単な使用のためにGradeValue classimplicitelyをintに変換するように設計することができます。