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)
它可以正常编译,但在运行时出现以下错误:
传递到字典中的模型项的类型为
“FieldResult1[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)