【问题标题】:DataAnnotations数据注解
【发布时间】:2009-11-25 14:49:00
【问题描述】:
public class Dinner
    {
        public string ID { get; set; }
        public string Title { get; set; }
        public Category Category { get; set; }
        public DateTime? DateCreated { get; set; }
    }

该类的模型视图(重要部分)是

public class DinnerModelView
    {
        ...
        [UIHint("DatePicker")]
        [DateTime(ErrorMessage = "Invalida date")]
        public DateTime? DateCreated { get; set; }
    }

日期时间属性在哪里

public class DateTimeAttribute : ValidationAttribute
    {
        public DateTimeAttribute () : base (() => "Invalid date") { }
        public DateTimeAttribute(string errorMessage) : base(() => errorMessage) { } 
        public override bool IsValid(object value)
        {
            if (value == null)
                return true;

            bool isValid = false;
            if (value is DateTime)
                isValid = true;

            DateTime tmp;
            if (value is String)
            {
                if(String.IsNullOrEmpty((string)value))
                    isValid = true;
                else
                    isValid = DateTime.TryParse((string)value, out tmp);
            }

            return isValid;
        }
    }

但是模型状态错误仍然显示“值 'xxxx' 对于 DateCreated 无效。” 我无法替换此消息。为什么?

【问题讨论】:

  • ValidationAttribute 的类型是什么?您将 lambda 传递给基本 ctor,但 DataAnnotations ValidationAttribute 没有这样的 ctor。
  • 我正在使用 mvc 2 附带的数据注释程序集。这里是 ValidationAttribute 的构造函数 protected ValidationAttribute(); protected ValidationAttribute(Func errorMessageAccessor); protected ValidationAttribute(string errorMessage);

标签: asp.net-mvc validation data-annotations


【解决方案1】:

似乎因为 DateCreated 属性是 DateTime 类型,所以 MVC 会在检查您的 DateTimeAttribute 之前以某种方式对其进行验证,从而永远不会收到您的自定义错误消息。

如果您将 DateCreated 改为字符串,它可能会起作用。但是由于您必须将值保存到数据库中,因此您不想更改 DateCreated 类型。因此,您可以创建一个名为 DateCreatedStr 的新属性,并让用户在此属性中键入数据。在保存数据之前,您可以将(已验证的)数据从 DateCreatedStr 移动到 DateCreated。

我知道这不是一个好方法,但它确实有效!

【讨论】:

    【解决方案2】:

    使用protected ValidationAttribute(string errorMessage) 代替 protected ValidationAttribute(System.Func errorMessageAccessor)。后者用于访问资源文件中定义的字符串。查看http://msdn.microsoft.com/en-us/library/cc679238.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 2017-11-30
      • 2021-07-15
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多