我有我从喜欢有用的帖子拼凑一个多步骤的向导该公司得到了一些问题,但是..这里的设置我有
[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,
谈到通过控制器后动作是一个新的对象,每次 - 我想看看这是可能的,而无需使用会话,但@ Html.Serialize? 和Post