我正在尝试使用 .NET MVC 在我的表单中实现向导功能。我遇到了达林·季米特洛夫(Darin Dimitrov )实现这一目标的方法。基本上他有一个向导视图模型,其中包含一个 IStep 列表。每个步骤都有自己的属性和验证。
他在视图上序列化向导(作为一种视图状态),然后将其和当前步骤发布到控制器。因此,向导的每个步骤,您只验证该步骤。如果成功,则增加当前步骤并重复。
在大多数情况下 - 这非常有效。但是,我在验证各个步骤时遇到了一个问题,因为我的一些步骤依赖于之前提交的验证值。
因此,我需要添加一种方法来允许各个向导步骤访问之前的步骤。
我决定这样做的方法是将向导包括在步骤中。
public interface IWizardStep
{
WizardViewModel Wizard { get; set; }
}
然后在 Darin 提供的模型绑定器中,为 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:
从类型“System.String”到类型“Wizard”的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。
我认为这是因为模型绑定器试图递归绑定?
有谁知道我该如何解决这个问题?或者 - 我是否正确地接近这个?有一个更好的方法吗?
我把上面所有的都是一个基本的示例项目来说明我遇到的问题。