转换我的MVC3视图中的对象

时间:2011-07-11 12:53:02

标签: c# asp.net-mvc-3 razor views

用户可以上传新文档并添加信息,每个文档都有一组默认属性。管理员可以添加少量额外属性。他可以添加字符串,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.

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

EditorForTextBoxFor等等都需要一个表达式,让他们可以访问您正在使用的属性上的元数据。 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的表达式提供的属性名称。