代码之家  ›  专栏  ›  技术社区  ›  Gup3rSuR4c

数据注释和元数据类型以及“缝合在一起的值”

  •  0
  • Gup3rSuR4c  · 技术社区  · 14 年前

    我正在尝试为我的模型中的一个对象设置数据注释验证,它有一个特殊的需求。我必须从本质上得到一些我要添加的额外属性,并将它们组合起来以得到不动产的价值。例如,我有一个基本对象:

    Task {
        public DateTime? Due
    }
    

    但我的表单包含以下字段:

    Task.DueDate
    Task.DueTimeHour
    Task.DueTimeMinute
    Task.DueTimePostfix
    

    所以我尝试:

    Task {
        public string DueDate
        public string DueTimeHour
        public string DueTimeMinute
        public string DueTimePostfix
    }
    

    这是可行的,但是我希望模型自动填充 Due 以及所有其他值的解析值。我不知道怎么做。

    我必须重写 到期 在元数据伙伴类中,但该类不知道我为原始类提供的额外属性。另外,我有一种感觉,如果我处理这些问题,那么从数据库中检索实际值时会遇到问题。

    所以我希望这里的人能对我如何完成我想要的有一个想法。如果我完全错了,我会很高兴被引导回到正确的道路上。

    提前感谢您的建议!

    更新

    所以,我可能已经找到了第一部分的解决方案,通过让原始类和元数据伙伴类从包含所有属性的另一个基类扩展而来。因此,这两个类都可以看到属性并可以使用它们。

    现在,我很难设定 到期 基于其他属性的属性。在此方面,我们将不胜感激。

    2 回复  |  直到 10 年前
        1
  •  1
  •   oleveau    14 年前

    您只需重写额外属性的get/set:

    public string DueDate {
      get {return Due.Date.ToShortDateString();}
      set { Due.Date = DateTime.Parse(value); }
    }
    public string DueTimeHour{
      get {return Due.Hours}
      set { Due.Hours = Int32.Parse(value); }
    }
    ...
    

    或者我错过了什么?

        2
  •  0
  •   Gup3rSuR4c    14 年前

    所以,我只花了几个小时的睡眠就解决了这个问题。以下是我的最终代码版本,适用于将来可能有相同问题的任何人:

    public partial class Task {
        public DateTime DueDate {
            get {
                return (DateTime.Now);
            }
            set {
                this.Due = value;
            }
        }
    
        [Range(0, 23)]
        public byte DueTimeHour {
            get {
                return (0);
            }
            set {
                if (this.Due.HasValue) {
                    this.Due = DateTime.Parse(this.Due.Value.ToShortDateString() + " " + value + ":00:00");
                };
            }
        }
    
        [Range(0, 59)]
        public byte DueTimeMinute {
            get {
                return (0);
            }
            set {
                if (this.Due.HasValue) {
                    this.Due = DateTime.Parse(this.Due.Value.ToString("M/d/yyyy h") + ":" + value + ":00");
                };
            }
        }
    
        public string DueTimePostfix {
            get {
                return (string.Empty);
            }
            set {
                if (this.Due.HasValue) {
                    this.Due = DateTime.Parse(this.Due.Value.ToString("M/d/yyyy h:m") + " " + value);
                };
            }
        }
    }
    

    最终,我不得不添加一个 get 让它工作,这让我好奇。我希望通过 set 因为我已经在操纵 Due 有价值,但如果没有 得到 . 也许有人能给我解释一下?