これまで、カスタム検証を行う場合や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を定義します。いいえ、ビューがレンダリングされたため、複数のフォームに分割することはできません。
提案をありがとう。