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对象。