Asp.net mvc 运行时的编辑器模板

Asp.net mvc 运行时的编辑器模板,asp.net-mvc,generics,model-binding,mvc-editor-templates,Asp.net Mvc,Generics,Model Binding,Mvc Editor Templates,这个问题有点难以解释,所以我将尝试给出一个例子。假设我有以下类型: public class FieldResult<T> { public Field Field { get; set; } public T Answer { get; set; } public FieldResult(Field field) { Field = field; } } 现在假设我有以下CheckBoxField编辑器模板: @model Fie

这个问题有点难以解释,所以我将尝试给出一个例子。假设我有以下类型:

public class FieldResult<T> {
    public Field Field { get; set; }
    public T Answer { get; set; }

    public FieldResult(Field field) {
        Field = field;
    }
}
现在假设我有以下CheckBoxField编辑器模板:

@model FieldResult<bool>
@Html.CheckBoxFor(m => m.Answer)
@model FieldResult
@CheckBoxFor(m=>m.Answer)
它可以正常编译,但在运行时出现以下错误:

传递到字典中的模型项的类型为 “FieldResult
1[System.Object]”,但此字典需要一个模型
类型为“FieldResult
1[System.Boolean]”的项


如果有人能说这是否可能,并提出一种可行的方法,我将不胜感激。谢谢

您尝试在模型类型为
FieldResult
的模板中传递
FieldResult
值,它们是不同的类型,因此您会得到该错误。您可以更改
Results
属性并将其设置为
IList
,也可以在视图中强制转换收藏项目

如果需要构建不同类型的结果,还可以考虑使用类继承:

public abstract class FieldResult {
    public Field Field { get; set; }

    public FieldResult(Field field) {
        Field = field;
    }
}

public class BooleanFieldResult : FieldResult {
    public bool Answer { get; set; }

    public FieldResult(Field field) : base(field) {
    }
}
您的
表单
类将如下所示:

public class Form {
    public IList<FieldResult> Results { get; set; }

    public Form(IList<Field> fields) {
        Results = // ... you choose which child class inherited from FieldResult you want to use
    }
}
@model BooleanFieldResult
@Html.CheckBoxFor(m => m.Answer)
然后您的
CheckBoxField
模板将如下所示:

public class Form {
    public IList<FieldResult> Results { get; set; }

    public Form(IList<Field> fields) {
        Results = // ... you choose which child class inherited from FieldResult you want to use
    }
}
@model BooleanFieldResult
@Html.CheckBoxFor(m => m.Answer)

由于出现了错误“模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用”。因此,我在编辑器外部进行了转换,并将其存储在变量中,结果显示正确。我将暂时不讨论这个问题,因为我需要做更多的工作,但是谢谢你让我走上正确的方向。我刚刚完成了测试,这很好。我能够摆脱我拥有的大量垃圾代码,这种方法允许我对每个字段类型进行自定义验证。再次感谢。
@model BooleanFieldResult
@Html.CheckBoxFor(m => m.Answer)