1

因此,当非空整数字段未设置为值时,我使用 ASP.NET MVC RC1 并使用 DefaultModelBinder 的验证来显示验证错误。这是 MVC 默认完成的。但是,对于 string(varchar) 字段,情况并非如此,因为从视图中向绑定器传递了一个空字符串,这对于非空 varchar 列是完全有效的。

但是在实践中,当我将列标记为非空时,我几乎总是意味着我希望它不为空。所以我想出了这种将验证检查添加到默认活页夹的方法:

public class DefaultEntityBinder : DefaultModelBinder
{
    protected override bool OnPropertyValidating(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
    {
        bool valid = base.OnPropertyValidating(controllerContext, bindingContext, propertyDescriptor, value);

        ColumnAttribute column = propertyDescriptor.Attributes.OfType<ColumnAttribute>().FirstOrDefault();
        if (column != null &&
            propertyDescriptor.PropertyType == typeof(string) &&
            !column.CanBeNull &&
            value.IsNullOrBlankString())
        {
            valid = false;
            bindingContext.ModelState[propertyDescriptor.Name].Errors.Add("A value is required");
        }
        return valid;
    }
}

我想知道这是否是实现将必需的字符串字段验证添加到 MVC 中的默认验证的目标的最有效方法。

4

1 回答 1

1

我查看了默认模型绑定(特别是 TypeHelpers.TypeAllowsNullValue),但我没有看到更好的方法。您可以在包含字符串的类型上实现 IDataErrorInfo,但您必须在您支持的每种类型上执行此操作。所以你在做什么是好的。如果您对第三方代码持开放态度,xVal验证框架值得考虑。然后,您可以使用 System.ComponentModel 中的属性之类的东西来装饰不可为空的字符串。

于 2009-02-13T14:09:59.910 回答