2

.NET MVC を使用してフォームにウィザード機能を実装しようとしています。Darin Dimitrov によるこれを達成する方法に出会いました。基本的に、彼は ISteps のリストを含むウィザード ビュー モデルを持っています。各ステップには、独自のプロパティと検証があります。

ビューでウィザードを (一種のビュー ステートとして) シリアル化し、それと現在のステップをコントローラーにポストします。したがって、ウィザードの各ステップで、そのステップのみを検証します。成功した場合は、現在のステップをインクリメントして繰り返します。

ほとんどの場合、これは非常にうまく機能します。ただし、個々のステップを検証するときに問題が発生しました。これは、一部のステップが検証のために以前に送信された値に依存しているためです。

そのため、ウィザードの個々のステップが前のステップにアクセスできるようにする方法を追加する必要があります。

これについて私が決めた方法は、ステップにウィザードを含めることです。

public interface IWizardStep
{
    WizardViewModel Wizard { get; set; }
}

次に、Darin が提供するモデル バインダーで、BindModel のオーバーライドを追加します。

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
    var step = (IStepViewModel)base.BindModel(controllerContext, bindingContext);
    step.Wizard = (WizardViewModel)serializer.Deserialize(controllerContext.HttpContext.Request.Form["wizard"], SerializationMode.Signed);
    return step;
}

これはうまくいくようですが、私のコントローラには ModelStateError があります:

タイプ 'System.String' からタイプ 'Wizard' へのパラメーター変換は失敗しました。これは、タイプ コンバーターがこれらのタイプ間で変換できないためです。

これは、モデル バインダーが再帰的にバインドしようとしていることが原因だと思いますか?

これを解決する方法を知っている人はいますか?または - 私はこれに正しく近づいていますか? これを行うより良い方法はありますか?

上記はすべて、私が抱えている問題を説明するための基本的なサンプル プロジェクトです。

4

2 に答える 2

1

これを HomeController の 18 行目に追加します...

ModelState.Remove("Wizard");

あなたが持っているものはうまくいくはずですが、より良いアプローチは、すべてのステップのプロパティを単一のモデルクラスに追加してから、各ステップに検証グループを使用することです...

https://nuget.org/packages/Mvc3ValidationGroups

于 2012-08-02T12:41:50.907 に答える
0

そのため、これが機能しなかった理由を突き止めることはできませんでしたが、すべてのステップをシリアル化してポストバックするのではなく、頭痛の種を救い、ウィザードをセッションに保存することにしました。そうすれば、ビュー モデルの Validate(ValidationContext) メソッドでウィザードを簡単に取得できます。うまくいくようです。

于 2012-08-04T18:21:54.077 に答える