2012-08-02 131 views
2

我想在我的表单中使用.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来说明我遇到的问题。

+1

正在将它存储在数据库中吗?你在一个无状态的世界中一直劈啪作响。 – 2012-08-02 11:10:55

+0

@SimonWhitehead不,它不是没有答案。事实上 - 我决定将它存储在会话中。 – 2012-08-02 14:52:58

回答

0

所以我从来没有为什么这个没有工作底部,但决定自己节省头痛和保存向导会话,而不是序列化和张贴回每一步。这样,我可以很容易地在视图模型的验证(ValidationContext)方法中获取向导。似乎运作良好。

1

添加到您的HomeController为线18 ...

ModelState.Remove("Wizard"); 

你应该工作什么的,但更好的方法可能是所有步骤的属性添加到一个模型类,然后使用验证组每一步...

https://nuget.org/packages/Mvc3ValidationGroups

+0

谢谢。从模型状态中删除属性的确行得通 - 如果不能确定错误的下划线原因。我会看看验证组。干杯。 – 2012-08-02 14:52:11