2011-11-14 16 views
1

ModelStateで何らかのカスタム検証が行われていたり、これまでにModelStateを操作していたときは、これまでのところプロパティ名を反映した魔法の文字列を使用しなければなりませんでした。確かに良い方法があるはずです。Mvc ModelState KeyForプロパティ

2つの送信ボタンがあるフォームがあるとします。

public class MyModel 
{ 
    [Required] 
    public string ValueOne { get; set; } 
    [Required] 
    public string ValueTwo { get; set; } 
} 

これは、常に両方のフィールドの妥当性を検証します。しかし、私は上記のモデルのためのフォームの表示とエディタに2つのボタンを追加したと言います。ボタン1はValueOneを必要とし、ボタン2は必要なValueTwoのみを必要とします。

Typically I would have custom validation code that checks which button was clicked and do something along the lines: 

private void ValidateViewModel(MyModel viewModel) 
{ 
    foreach (var key in ModelState.Keys) 
     ModelState[key].Errors.Clear(); 
    if (Request[{ButtonOneName}] != null && string.IsNullOrEmpty(viewModel.ValueOne)) 
     ModelState.AddModelError("ValueOne", "Required"); 
    else if (Request[{ButtonTwoName}] != null && string.IsNullOrEmpty(viewModel.ValueTwo)) 
     ModelState.AddModelError("ValueTwo", "Required"); 
} 

私の牛は魔法の文字列「ValueOne」と「ValueTwo」を持っています。また、エラーがクリアされる方法もあります。これらの鍵を生成する方法はありますか?私は車輪の再発明を開始する前に

ModelState.Get<MyModel>(m => m.ValueOne) 

- この隠されたどこかのようなものが既にあります:

ModelState.KeyFor<MyModel>(m => m.ValueOne) 

そして論理的な拡張:私のようなものを探していますか?

質問する前に、私は通常、送信ボタン名を表す定数文字列を含む静的クラスのSubmitActionsを定義します。ビューがレンダリングされたため、複数のフォームに分割することはできません。

ありがとうございます。

+0

あなたがこの解決策を見つけますか? ModelState.KeyFor (m => m.ValueOne)は、まさに私がやっている何かのために必要なものでしょう... – LDJ

答えて

1

カスタムを実装するために、組み込みに.NET 4 IValidatableObjectインタフェースを使って、だから、

相互に関連するプロパティに基づいて検証をチェックすることができるようになりますMVC 3でモデル検証の改善は、ありますクラスの検証メソッド。このメソッドは、複数のプロパティに渡って検証ルールを適用し、複数の検証エラーを返すことができます。

あなたはそれを見ましたか?

Model Validation Improvements part

+0

ありがとう。私は確かにこのようなことをやります。それは私が必要とすることをすることができるように聞こえる。私は、そのアプローチを組み込みの検証属性と組み合わせることができます。私はそれをテストする時間があるときに私はフィードバックを残します。 –

関連する問題