用户可以上传新文档并添加信息,每个文档都有一组默认属性。管理员可以添加少量额外属性。他可以添加字符串,bool,datetime值。
生成我的视图时,我会获得具有额外属性的Dictionary<String,Object>
。
在我看来,我想为对象生成正确的控件。因此,当它是一个datetime对象时,我想加载jquery日历,boolean一个复选框等。
@switch (Model.ExtraFields[i].PropertyType)
{
case (short)Enums.PropertyType.Boolean:
@Html.TextBoxFor(model => Convert.ToBoolean(Model.Values[i].ExtraFieldValue))
break;
case (short)Enums.PropertyType.DateTime:
@Html.TextBoxFor(model => Convert.ToDateTime(Model.Values[i].ExtraFieldValue))
break;
default:
@Html.TextBoxFor(model => Model.Values[i].ExtraFieldValue)
break;
}
它总是在Convert.To ...
上出错Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.
有什么想法吗?
答案 0 :(得分:1)
EditorFor
,TextBoxFor
等等都需要一个表达式,让他们可以访问您正在使用的属性上的元数据。 Convert.ToDateTime
删除该访问权限(因为它返回一个值),因此方法不知道要使用的属性名称或[Display]
属性等任何其他信息。我建议你这样做:
@switch (Model.ExtraFields[i].PropertyType) {
case (short)Enums.PropertyType.Boolean:
@Html.EditorFor(model => Model.Values[i].ExtraFieldValue, "BooleanEditor")
break;
case (short)Enums.PropertyType.DateTime:
@Html.EditorFor(model => Model.Values[i].ExtraFieldValue, "DateTimeEditor")
break;
default:
@Html.TextBoxFor(model => Model.Values[i].ExtraFieldValue)
break;
}
然后创建EditorTemplates
(作为控制器的子目录,使用名为BooleanEditor.cshtml
的特定模板,依此类推:
@model object
@Html.CheckBox("", Convert.ToBoolean(Model))
将第一个参数留空,您将自动使用通过调用EditorFor
的表达式提供的属性名称。