为什么我的int?价值被验证,好像它是必需的?

时间:2012-01-31 18:13:01

标签: c# asp.net asp.net-mvc-3 jquery-validate

我有一个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
}

3 个答案:

答案 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中不可为空。