我有一个EF Code First设置,我有一个特定的列,通过注释标记为必需。此列具有在数据库中指定的默认值约束。
我要做的是允许用户在表单上输入值,但如果省略它,则使用数据库中的默认值。我没有运气。
如果我没有输入任何内容,则表单上会显示Required错误。如果我添加[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
注释,则会忽略用户输入的值,并且它始终使用数据库默认值。
答案 0 :(得分:0)
您可以做的是在解析表单值时执行魔法 。
从表单中检查特定列的用户输入时,请使用
检查列if (!String.IsNullOrWhiteSpace(value))
//set the value in the database entry based on user's input
上面的代码只会在数据库中输入一个值,如果在表单上输入了某些内容。
只有在用户提交'后才能解析表单的值,此解决方案才有效。
答案 1 :(得分:0)
这是我对这个问题的解决方案,这个问题不是很好,但是可以管理。
在我的模型中,我用以下内容注释了该属性:
[DefaultValueSql("'A'")]
[DefaultValue("A")]
[Required]
DefaultValueSql是一个自定义属性,用于在执行迁移时处理SQL默认列值的创建。 DefaultValue匹配该值。我知道这是违反DRY的,但使用此解决方案无论如何都不需要数据库中的默认值(我将来可能会将其删除)。
在我的Controller中,在Create / Edit ActionResult后期处理程序上,我添加了这个:
if (model.ActiveIndicator == null)
{
model.ActiveIndicator = ((DefaultValueAttribute)(model.GetType().GetProperty("ActiveIndicator").GetCustomAttributes(typeof(DefaultValueAttribute), true).First())).Value.ToString();
ModelState["ActiveIndicator"].Errors.Clear(); // Removes Model Error
}
这将默认设置为注释中列出的DefaultValue,并删除此属性的ModelState错误,允许ModelState.IsValid为true。
此解决方案适用于字符串默认值,但非字符串(不能为null的类型)应该以不同方式完成,可能在模型类构造函数中。
编辑:如果您使用的是TryUpdateModel,则必须设置ModelState值而不是提交的模型值:
if (model.ActiveIndicator == null)
{
var defValue = ((DefaultValueAttribute)(model.GetType().GetProperty("ActiveIndicator").GetCustomAttributes(typeof(DefaultValueAttribute), true).First())).Value.ToString();
ModelState.SetModelValue("ActiveIndicator", new ValueProviderResult(defValue, "", CultureInfo.InvariantCulture));
ModelState["ActiveIndicator"].Errors.Clear(); // Removes Model Error
}