我有一个View,该视图呈现自定义字段类型的输入。这些是动态的,由管理员配置,每个自定义字段可以是int
,DateTime
,bool
等。因此,我将CustomField
的值存储为{{1} },并在SQL Server中通过object
列类型对其进行备份。此视图的ViewModel包含sql_variant
的集合:
CustomFields
这些在我的视图中使用for循环呈现:
public class EditDataViewModel
{
public Guid RecordId { get; set; }
public IList<CustomFieldViewModel> CustomFields { get; set; }
}
public class CustomFieldViewModel
{
public Guid? CustomFieldId { get; set; }
public Guid CustomFieldTypeId { get; set; }
public CustomFieldDataType DataType { get; set; }
public bool IsRequired { get; set; }
public string DisplayName { get; set; }
public object Value { get; set; }
}
这些确实会发回到控制器操作中:
但是每个@{
int i = 0;
foreach (CustomFieldViewModel customField in Model.CustomFields)
{
@Html.Hidden($"CustomFields[{i}].CustomFieldId", customField.CustomFieldId)
@Html.Hidden($"CustomFields[{i}].CustomFieldTypeId", customField.CustomFieldTypeId)
@Html.Hidden($"CustomFields[{i}].DataType", customField.DataType)
@Html.Hidden($"CustomFields[{i}].IsRequired", customField.IsRequired)
@Html.Hidden($"CustomFields[{i}].DisplayName", customField.DisplayName)
<div>
<label>@customField.DisplayName</label>
<div>
@if (customField.DataType == CustomFieldDataType.Boolean)
{
@(Html.DevExtreme().CheckBox()
.Name($"CustomFields[{i}].Value")
.Value(customField.Value != null ? (bool)customField.Value : false)
)
}
else if(customField.DataType == CustomFieldDataType.Date)
{
@(Html.DevExtreme().DateBox()
.Name($"CustomFields[{i}].Value")
.Value((DateTime?)customField.Value)
)
}
// etc...
</div>
</div>
i++;
}
}
的{{1}}属性为null,所有其他属性均已正确填充。
编辑:这似乎确实是由于绑定到类型Value
的属性引起的。如果我将CustomField
中的object
属性更改为Value
,则在Post上的控制器操作中正确设置了该属性。