我有一个多步骤向导,我从像这样的有用帖子中拼凑而成,但是它有一些问题.. 这是我的设置
[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;
}
我的问题是向导每次发布时都是一个新对象 - 当我试图通过相同的模型来填充数组中的每个步骤时。有谁知道我在这里哪里出错了?
这是模型绑定
全球.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;
}
}
提前致谢
编辑:
如果我理解,使用会话的替代方法是序列化我的模型(如下),并在我的控制器操作中反序列化。我在模型上设置了发布到控制器的值..它会返回到下一步的视图中,依此类推..直到最后一步,当我有一个填充了每个步骤的向导模型时。
索引.cshtml
@using (Html.BeginForm())
{
@Html.Serialize("wizard", Model);
etc...
}
所以我在这里尝试反序列化的向导参数
[Deserialize] WizardModel wizard,
每次通过控制器发布操作都是一个新对象 - 我想看看这是否可能不使用 Session 但@Html.Serialize?和发布