我有一个int?查看在客户端验证的模型属性,就像它是必需的一样。也就是说,如果我将该字段留空,则不会提交。字符串属性也不会发生同样的情况。
为我的编辑器呈现的HTML是:
<input type="text" value="" name="StatusIdSearch" id="StatusIdSearch" data-val-number="The field Status must be a number." data-val="true" class="text-box single-line">
我认为data-val-number
导致错误,因为没有什么不是数字,但我无法确定原因。
有什么想法吗?
修改
视图模型:
public class CompromissoSearchModel
{
// other properties removed for the sake of clarity
[Display(Name = "Status")]
[EnumDataType(typeof(StatusCompromisso))]
public int? StatusIdSearch { get; set; }
// other properties removed for the sake of clarity
}
答案 0 :(得分:3)
您看到的消息与必填字段验证无关。你得到这个是因为ClientDataTypeModelValidatorProvider
添加了客户端数字验证,如果类型可以为空,它就会忽略。你可以check the code yourself:
private static IEnumerable<ModelValidator> GetValidatorsImpl(
ModelMetadata metadata,
ControllerContext context)
{
Type type = metadata.RealModelType;
if (IsNumericType(type)) {
yield return new NumericModelValidator(metadata, context);
}
}
IsNumericType
实施:
private static bool IsNumericType(Type type)
{
// strip off the Nullable<>
Type underlyingType = Nullable.GetUnderlyingType(type);
return _numericTypes.Contains(underlyingType ?? type);
}
由于不考虑可空,因此您始终可以获得该验证。在解决方案方面,您需要从已使用的提供程序中删除ClientDataTypeModelValidatorProvider
,或者将其替换为不会忽略可为空的自定义提供程序。
答案 1 :(得分:1)
您应该能够将以下代码添加到Global.asax文件中的Application_Start
方法中以解决此问题:
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
答案 2 :(得分:0)
我遇到了完全相同的问题并设法找到解决方案。这些解决方案都不适合我,所以我想我会为其他遇到此问题的人发布我的解决方案。
问题不在于模型绑定器将该字段验证为无效,而是在使用TryUpdateModel时,viewmodel的可空属性在数据库实体中不可为空。
更清楚的解释:
TryUpdateModel(dbUser, "", new[]{
"DecimalProperty"
}));
viewmodel中的“DecimalProperty”可以为空,但在dbUser中不可为空。