我想在我的表单中使用.NET MVC实现向导功能。我偶然发现了Darin Dimitrov的method of achieving。基本上他有一个向导视图模型,其中包含一个ISteps列表。每一步都有自己的属性和验证。与自定义模型绑定的递归模型绑定
他将序列化视图上的向导(作为一种视图状态),然后将其和当前步骤发布到控制器。因此,向导的每一步都只验证该步骤。如果成功,则增加当前步骤并重复。
大多数情况下 - 这个工作很好。不过,在验证各个步骤时我遇到了问题,因为我的一些步骤依赖于以前提交的值进行验证。
所以,我需要添加一种方法来允许单个向导步骤访问先前的步骤。
我决定去做这件事的方法是在步骤中包含向导。
public interface IWizardStep
{
WizardViewModel Wizard { get; set; }
}
然后在达林提供的模型粘合剂,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:
The parameter conversion from type 'System.String' to type 'Wizard' failed because no type converter can convert between these types.
我假设这是由于模型绑定器试图递归绑定的事实?
有谁知道我该如何解决这个问题?或者 - 我是否正确地接近这个?有一个更好的方法吗?
我已经把上述所有是一个basic sample project来说明我遇到的问题。
正在将它存储在数据库中吗?你在一个无状态的世界中一直劈啪作响。 – 2012-08-02 11:10:55
@SimonWhitehead不,它不是没有答案。事实上 - 我决定将它存储在会话中。 – 2012-08-02 14:52:58