3

私はこのような便利な投稿からまとめたマルチステップウィザードを持っていますが、いくつかの問題があります..これが私が持っているセットアップです

[Serializable]
public class WizardModel
{

    public IList<IStepViewModel> Steps 
    { 
        get; 
        set; 
    }
    public void Initialize()
    {
        Steps = typeof(IStepViewModel)
            .Assembly
            .GetTypes()
            .Where(t => !t.IsAbstract && typeof(IStepViewModel).IsAssignableFrom(t))
            .Select(t => (IStepViewModel)Activator.CreateInstance(t))
            .ToList();
    }

}

マイウィザードコントローラー

    public ActionResult Index()
    {
        var wizard = new WizardModel();     
        wizard.Initialize();
        //this populates wizard.Steps with 3 rows of IStepViewModel
        return View(rollover);       
    }

    [HttpPost]
    public ActionResult Index(
        [Deserialize] WizardModel wizard,
        IStepViewModel step
        )
    {
        //but when this runs wizard is a new class not the one previously Initialized
         wizard.Steps[rollover.CurrentStepIndex] = step;
    }

私の問題は、ウィザードが投稿されるたびに新しいオブジェクトであるということです-配列の各ステップにデータを入力する際に​​同じモデルを渡そうとしているときです。誰かが私がここでどこが間違っているのか考えていますか?

これがModelBindingです

Global.asax

   ModelBinders.Binders.Add(typeof(IStepViewModel), new FormTest.Models.StepViewModelBinder());

  public class StepViewModelBinder : DefaultModelBinder
{
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var stepTypeValue = bindingContext.ValueProvider.GetValue("StepType");
        var stepType = Type.GetType((string)stepTypeValue.ConvertTo(typeof(string)), true);
        var step = Activator.CreateInstance(stepType);
        bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => step, stepType);
        return step;
    }
}

前もって感謝します

編集

私が理解している場合、セッションを使用する代わりに、モデルをシリアル化し(以下)、コントローラーアクションで逆シリアル化することもできます。コントローラに投稿されたモデルに値を設定します。これは、次のステップなどでビューに戻されます。各ステップにウィザードモデルを設定する最後のステップまで、値を設定します。

Index.cshtml

   @using (Html.BeginForm())
   {
         @Html.Serialize("wizard", Model);  
         etc...
   }   

したがって、ここで逆シリアル化しようとするウィザードパラメータ

    [Deserialize] WizardModel wizard,

コントローラを介して来るpostアクションは毎回新しいオブジェクトです-これがSessionを使用せずに可能かどうかを確認したいのですが、@ Html.Serialize?と投稿

4

3 に答える 3

1

セッションを使用して、リクエスト間でオブジェクトを永続化します。

Session["SuperWizard"] = wizard
于 2012-06-01T13:22:25.437 に答える
1

このコードは最終的に仕事をしました。コントローラアクションの内部では、

        var serializer = new MvcSerializer();
        var value = Request["wizard"];
        var wizard = (WizardModel)serializer.Deserialize(value, SerializationMode.Signed);

そして、ビューで

    @Html.Serialize("wizard", Model, SerializationMode.Signed);   
于 2012-06-04T13:00:14.973 に答える
0

モデルバインディングは、POSTされたフォーム値を新しいオブジェクトにバインドするために使用されます。したがって、Mikeが提案するように、まったく同じオブジェクトが必要な場合は、Sessionまたはその他の永続ストアを使用する必要があります。ただし、オブジェクトを毎回再作成できる場合は、フォームに十分なデータを入力するだけで、POSTされたときにすべてを再データバインドして、新しいオブジェクトで同じ値を取得できます。

于 2012-06-01T13:29:46.550 に答える