1

これまで、カスタム検証を行う場合やModelStateをいじる場合は常に、(プロパティ名を反映する)マジックストリングに依存する必要がありました。確かにもっと良い方法があるはずです。

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.KeyFor<MyModel>(m => m.ValueOne)

そして、論理的な拡張:

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

車輪の再発明を始める前に、このようなものはすでにどこかに隠されていますか?

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

提案をありがとう。

4

1 に答える 1

1

MVC 3 にはモデル検証の改善があり、相互に関連するプロパティに基づいて検証を確認できるようになります。

そのため、.NET 4 に組み込まれている IValidatableObject インターフェイスを使用して、クラスにカスタム検証メソッドを実装します。このメソッドは、複数のプロパティに検証ルールを適用し、複数の検証エラーを返す可能性があります。

ご覧になりましたか?

モデル検証の改善部分

于 2011-11-15T03:25:24.857 に答える