MVC3:非字符串的EditorForModel()

时间:2012-05-10 22:39:25

标签: asp.net asp.net-mvc-3 model-validation

我希望在使用EditorForModel()的表单中使用模型。对于所有非String数据类型(如bool,DateTime等),即使我没有设置[Required}数据注释,创建的表单也会生成所需的字段。如何设置Object.cshtml文件以识别这不是必填字段?

1 个答案:

答案 0 :(得分:1)

这不是“必需”问题,它是基本的ModelBinding comportement:在DefaultModelBinder中,非可空类型不能为null。如果ModelBinding失败,Model.IsValid = false =>显示这种错误。

您不会收到bool?(可以为空)或string(相同)的“错误”消息,但您将拥有bool(这不是。)

(它是基本的“强类型逻辑”:尝试在c#中编写DateTime dt = null ...)

因此,一个解决方案可能是创建一个新的ModelBinder(例如,将所有“null”bool设置为false)。 但我真的不确定你需要什么。默认行为通常很好

我给你一个CustomModelBinder的例子:我们使用它来避免在大多数数字字段中输入0值:当在Int32,UInt32和double值的字段中没有输入任何值时,它设置为0 / p>

public class AcceptNullAsZeroModelBinder : DefaultModelBinder
    {
        protected override void SetProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, object value)
        {
            if (value == null && (
                propertyDescriptor.PropertyType == typeof(Int32) ||
                propertyDescriptor.PropertyType == typeof(UInt32) ||
                propertyDescriptor.PropertyType == typeof(double)
                ))
            {
                base.SetProperty(controllerContext, bindingContext, propertyDescriptor, 0);
                return;
            }

            base.SetProperty(controllerContext, bindingContext, propertyDescriptor, value);
        }
    }