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