c# - 使用自定义模型绑定(bind)器的递归模型绑定(bind)

标签 c# .net asp.net-mvc-3 model-binding asp.net-mvc-futures

我正在尝试使用 .NET MVC 在我的表单中实现向导功能。我遇到了 method of achieving这是 Darin Dimitrov 的作品。基本上他有一个向导 View 模型,其中包含一个 ISteps 列表。每个步骤都有自己的属性和验证。

他在 View 上序列化向导(作为一种 View 状态),然后将其和当前步骤发布到 Controller 。因此,向导的每一步,您只验证该步骤。如果成功,则增加当前步骤并重复。

在大多数情况下 - 这工作得很好。但是,我在验证各个步骤时遇到了一个问题,因为我的一些步骤依赖于之前提交的值来进行验证。

因此,我需要添加一种方法来允许各个向导步骤访问之前的步骤。

我决定采用的方法是在步骤中加入向导。

public interface IWizardStep
{
    WizardViewModel Wizard { get; set; }
}

然后在 Darin 提供的模型绑定(bind)器中,为 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;
}

这似乎可行,但是在我的 Controller 中我有一个 ModelStateError:

The parameter conversion from type 'System.String' to type 'Wizard' failed because no type converter can convert between these types.

我假设这是因为模型绑定(bind)器试图递归绑定(bind)?

有谁知道我该如何解决这个问题?或者 - 我是否正确地接近了这个?有更好的方法吗?

我把上面所有的都是一个basic sample project来说明我遇到的问题。

最佳答案

将它作为第 18 行添加到您的 HomeController...

ModelState.Remove("Wizard");

您所拥有的应该有效,但更好的方法可能是将所有步骤的属性添加到单个模型类,然后对每个步骤使用验证组...

https://nuget.org/packages/Mvc3ValidationGroups

关于c# - 使用自定义模型绑定(bind)器的递归模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11775581/

相关文章:

asp.net-mvc-3 - Ninject.MVC3 Bootstrapper 的 Kernel 属性被标记为过时。如何访问内核?

.net - 由于 .net MVC 中的 HttpContext,测试我的 Controller 引发错误

c# - 将自定义类型的变量传递给自定义 MSBuild 任务

asp.net-mvc - MvcIntegrationTestFramework 或针对 ASP.NET MVC 3 更新的替代方案

c# - 如何从外部字符串文件创建数组

c# - 如何使用命名空间与 C++ 互操作

c# - ETW 格式字符串中的转义字符?

c# - 如何发布对象列表?

c# - 简单更新查询不更新。没有异常(exception),没有错误。没什么

.net - Autofac 和 IDisposable 接口(interface)