У меня есть представление, которое отображает входные данные для пользовательских типов полей. Они являются динамическими и настраиваются администраторами, каждое настраиваемое поле может быть int
, DateTime
, bool
и т. Д. Из-за этого я сохраняю значения CustomField
как object
и возвращаю их в столбце sql_variant
введите SQL Server. Модель представления для этого представления содержит коллекцию CustomFields
:
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; }
}
Они отображаются в моем представлении с использованием цикла for:
@{
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++;
}
}
Они возвращаются в действие контроллера:
Но свойство Value
каждого CustomField
равно нулю, все остальные свойства заполнены правильно.
Редактировать: Похоже, что это действительно вызвано привязкой к свойству типа object
. Если я изменю свойство Value
в CustomFieldViewModel
на string
, свойство будет правильно установлено в действии контроллера для Post.