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

C# 数据注释和元数据类型以及;“缝合在一起的值”;,c#,validation,asp.net-mvc-2,data-annotations,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

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

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

我必须在metadata buddy类中重写
Due
的getter/setter,但该类不会知道我给原始类的额外属性。另外,我有一种感觉,如果我搞砸了这些,我将无法从数据库中检索到真正的值

所以我希望这里的人能对我如何实现自己的目标有一个想法。如果我完全错了,我会很感激被引导回到正确的道路上

提前感谢您的建议

更新

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


现在,我很难根据其他属性设置
Due
属性的值。在此方面的帮助将不胜感激。

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

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

或者我错过了什么?

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

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
,它将无法工作。也许有人能给我解释一下吗?

你可能有什么想法。额外属性,
DueDate
DueTimeHour
DueTimeMinute
DueTimePostfix
仅在发布期间填写,我希望将它们缝合在一起,形成
到期
。所以,这是唯一一次使用它们。当我从数据库中读取数据时,它应该进入正常流程,我只处理
Task.Due
。好的,所以我尝试了你的解决方案,尽管看起来很好,但它不起作用,因为
DateTime.Date
是只读属性,因此我无法操作它。我需要根据其他属性中的值创建一个完整的DateTime对象。