数据注释和元数据类型以及“拼接价值”

时间:2010-10-18 08:41:40

标签: c# validation asp.net-mvc-2 data-annotations

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

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的值。我不知道该怎么做。

我必须覆盖元数据伙伴类中Due的getter / setter,但该类不会知道我给原始类的额外属性。此外,我有一种感觉,如果我搞乱这些,我将无法从数据库中检索实际值。

所以我希望这里有人可以知道如何实现我的目标。如果我完全错了,我会很感激被引导回正确的道路。

提前感谢任何建议!

更新

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

现在,我很难根据其他属性设置Due属性的值。在这方面可以获得帮助。

2 个答案:

答案 0 :(得分:1)

您只需覆盖额外属性的获取/设置:

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); }
}
...

或者我错过了什么?

答案 1 :(得分:0)

所以,我认为只花了几个小时的睡眠。这是我的最终代码版本,适用于将来可能遇到同样问题的任何人:

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值,但如果没有get它就无法工作。也许有人可以向我解释那个?