0

4 つのプロパティを持つモデル クラスがあります。

public class ModelClass
    {
        [Required]
        public string Prop1 { get; set; }

        [MaxLength(5)]
        public string Prop2 { get; set; }

        [MinLength(5)]
        public string Prop3 { get; set; }

        [MinLength(5)]
        public string Prop4 { get; set; }
    }

prop2のみを入力するビュー:

@model ModelClass
@Html.TextBoxFor(m => m.Prop2)    

そしていくつかのコントローラー:

[HttpPost]
        public ActionResult Index(ModelClass postedModel)
        {
            var originalModel = Session["model"] as ModelClass;
            return View();
        }

問題は、モデル全体が に格納されてSessionいることです。Prop1必要なのは、に保存されたモデルのみを検証することですSession。検証が失敗したView1場合Prop1は、 invlaid の場合、またはが無効の場合などView3、他のものにリダイレクトする必要があります。投稿されたモデルの検証情報となるため、例えばなどの方法は使えません。また、取得しただけで、それが無効である理由についての情報を取得できないため、使用できません。したがって、無効な場合または無効な場合にリダイレクトすることはできません。Prop3Prop2SessionModelStateModelState.IsValidField()controller.TryValidateModel(originalModel)falsefalseView1Prop1View3Prop3では、originalModel の Prop1 のみを検証するにはどうすればよいでしょうか?

4

1 に答える 1

1

ビュー モデルを使用します。

public class Step1ViewModel
{
    [Required]
    public string Prop1 { get; set; }
}

次に、ビューモデルに強く型付けされたビューを作成します。

@model Step1ViewModel
@Html.TextBoxFor(m => m.Prop1) 

最後に、HttpPost コントローラー アクションにビュー モデルをアクション引数として使用させて、現在のウィザード ステップのコンテキストでのみ正常に検証できるようにします。

[HttpPost]
public ActionResult Index(Step1ViewModel postedModel)
{
    if (!ModelState.IsValid)
    {
        // validation for this step failed => redisplay the view so that the 
        // user can fix his errors
        return View(postedModel);
    }

    // validation passed => fetch the model from the session and update the corresponding
    // property
    var originalModel = Session["model"] as ModelClass;
    originalModel.Prop1 = postedModel.Prop1;

    return RedirectToAction("Step2");
}
于 2013-01-13T12:51:31.423 に答える