私は大きなモデルを持っています(大きなとは、モデルクラスに多くのフィールド/プロパティが含まれ、それぞれに少なくとも1つの検証属性(Required
、MaxLength
などMinLength
)があることを意味します)。ユーザーがモデルにデータを入力するための多くの入力を含む1つのビューを作成する代わりに、ユーザーがモデルフィールドの一部を入力して次のステップ(ある種の「ウィザード」)に進む複数のビューを作成したいと思います。ステップ間でリダイレクトしている間、塗りつぶされていないモデルオブジェクトをに格納しますSession
。以下のようなもの:
モデル:
public class ModelClass
{
[MaxLength(100)] ...
public string Prop1{get;set;}
[MaxLength(100)] ...
public string Prop2{get;set;}
...
[Required][MaxLength(100)] ...
public string Prop20{get;set;}
}
コントローラ:
[HttpPost]
public ActionResult Step1(ModelClass postedModel)
{
// user posts only for example Prop1 and Prop2
// so while submit I have completly emty model object
// but with filled Prop1 and Prop2
// I pass those two values to Session["model"]
var originalModel = Session["model"] as ModelClass ?? new ModelClass();
originalModel.Prop1 = postedModel.Prop1;
originalModel.Prop2 = postedModel.Prop2;
Session["model"] = originalModel;
// and return next step view
return View("Step2");
}
[HttpPost]
public ActionResult Step2(ModelClass postedModel)
{
// Analogically the same
// I have posted only Prop3 and Prop4
var originalModel = Session["model"] as ModelClass;
if (originalModel!=null)
{
originalModel.Prop3 = postedModel.Prop3;
originalModel.Prop4 = postedModel.Prop4;
Session["model"] = originalModel;
// return next step view
return View("Step3");
}
return View("SomeErrorViewIfSessionBrokesSomeHow")
}
Step1
ビューにはとの入力のみがProp1
ありProp2
、ステップ2ビューにはProp3
との入力が含まれていますProp4
。
しかし、ここにあるものがあります
たとえば、ユーザーがオンの場合、手順1で、Prop1に100文字を超える値を入力すると、クライアント側の検証が正常に機能します。しかし、もちろん、私はこの値を検証し、コントローラーのサーバー側で検証する必要があります。フルモデルがあれば、次のようにします。
if(!ModelState.IsValid) return View("the same view with the same model object");
そのため、ユーザーはフォームにもう一度入力して修正する必要があります。
しかし、ステップ1で、ユーザーは20の2つのプロパティのみを入力したため、それらを検証する必要があります。ModelState.IsValid
モデルの状態が無効になるため使用できません。ご覧のとおり、ユーザーが送信して、がnullの場合、属性でProp20
マークされているため、は無効です。もちろん、ユーザーがステップ2に進み、すべてのステップを入力し、最後のステップでのみモデルの状態を検証できるようにすることはできますが、ユーザーがステップ1を間違って入力した場合、ユーザーがステップ2に進むことを許可したくありません。そして、私はコントローラーでこの検証が必要です。したがって、問題は次のとおりです。モデルの一部のみを検証するにはどうすればよいですか?一部のモデルプロパティのみが検証属性と一致することを確認するにはどうすればよいですか?[Required]
Prop1
Prop2
Prop20
ModelState