我正在尝试使用.NET MVC在我的表单中实现向导功能。我看到了达林·季米特洛夫的实现方法。基本上,他有一个向导视图模型,其中包含一个ISteps列表。每个步骤都有自己的属性和验证。
他在视图上序列化向导(作为一种视图状态),然后将该向导和当前步骤发布到控制器。因此,向导的每一步都只验证该步骤。如果成功,增加当前步骤并重复。
在大多数情况下,这是很好的工作。但是,我在验证各个步骤时遇到了一个问题,因为我的一些步骤依赖于以前提交的值来进行验证。
因此,我需要添加一种方法来允许各个向导步骤访问前面的步骤。
我决定这样做的方法是在步骤中包括向导。
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”到类型“向导”之间的参数转换失败,因为无法在这些类型之间进行转换。
我认为这是由于模型绑定试图递归地绑定吗?
有人知道我怎么能解决这个问题吗?或者-我的做法正确吗?有更好的方法吗?
我已经把以上所有的都是一个基本样本工程来说明我的问题。
发布于 2012-08-04 18:21:54
因此,我从来没有弄清楚为什么这不起作用,但我决定省去头痛,并在会话中保存向导,而不是序列化和张贴它的每一步。这样,我就可以很容易地在视图模型的验证(ValidationContext)方法中获得向导。似乎效果很好。
发布于 2012-08-02 12:41:50
将这个添加到您的HomeController中作为第18行..。
ModelState.Remove("Wizard");您所拥有的应该工作,但更好的方法可能是将步骤的所有属性添加到单个模型类中,然后为每个步骤使用验证组。
https://stackoverflow.com/questions/11775581
复制相似问题