在C#中的常量DateTime
我想把一个常量date时间放在一个属性参数中,我如何使一个常量date时间? 它与EntLibvalidation应用程序块的ValidationAttribute
有关,但也适用于其他属性。
当我这样做:
private DateTime _lowerbound = new DateTime(2011, 1, 1); [DateTimeRangeValidator(_lowerbound)]
我去拿:
An object reference is required for the non-static field, method, or property _lowerbound
并通过这样做
private const DateTime _lowerbound = new DateTime(2011, 1, 1); [DateTimeRangeValidator(_lowerbound)]
我去拿:
types“System.DateTime”不能被声明为const
有任何想法吗? 这样做是不可取的:
[DateTimeRangeValidator("01-01-2011")]
我一直在阅读的解决scheme是去一个string的路由,或作为三个单独的parameter passing在日/月/年,因为C#目前不支持DateTime
文本值。
下面是一个简单的例子,它可以让你传入三个int
types的参数或一个string
到属性中:
public class SomeDateTimeAttribute : Attribute { private DateTime _date; public SomeDateTimeAttribute(int year, int month, int day) { _date = new DateTime(year, month, day); } public SomeDateTimeAttribute(string date) { _date = DateTime.Parse(date); } public DateTime Date { get { return _date; } } public bool IsAfterToday() { return this.Date > DateTime.Today; } }
正如前面的一些回应所指出的那样,一个const DateTime
在C#中不是本地支持的,并且不能用作属性参数。 尽pipe如此, readonly DateTime
(在Effective C#第2版[项目2]中推荐使用const
)对于其他情况是一个简单的解决方法,如下所示:
public class MyClass { public static readonly DateTime DefaultDate = new DateTime(1900,1,1); }
DateTimeRangeValidator可以采用string表示forms(ISO8601格式)作为参数
例如
LowerBound UpperBound [DateTimeRangeValidator("2010-01-01T00:00:00", "2010-01-20T00:00:00")]
单个参数将被解释为UpperBound,所以如果你想inputLowerBound ,你需要2。 检查文档以查看UpperBound是否存在特殊的“无关”值,或者是否需要将其设置为非常遥远的未来date。
哎呀,只是重新阅读和注意
“这样做是不可取的”
[DateTimeRangeValidator("01-01-2011")]
为什么不?
将
private const string LowerBound = "2010-01-01T00:00:00"; private const string UpperBound = "2010-01-20T00:00:00"; [DateTimeRangeValidator(LowerBound, UpperBound)]
比(VBdate文字格式)更差/不同
private const DateTime LowerBound = #01/01/2000 00:00 AM#; private const DateTime UpperBound = #20/01/2000 11:59 PM#; [DateTimeRangeValidator(LowerBound, UpperBound)]
心连心,
艾伦
一种解决scheme是将date分为日,月和年的字段,然后扩展RangeAttribute
这样你就可以获得内置validation的所有好处。
看下面的例子:
public class PermittedYearRangeAttribute : RangeAttribute { public PermittedYearRangeAttribute() : base(1900, DateTime.Now.AddYears(-50).Year) { ErrorMessage = string.Format("Year must be between 1900 and {0}", DateTime.Now.AddYears(-50).Year); } }
在Global.asax.cs
Application_Start()
方法中添加下面一行
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(PermittedYearRangeAttribute), typeof(RangeAttributeAdapter));
在模型装饰属性中:
[Required(ErrorMessage = "Please enter year")] [PermittedYearRange] public int Year { get; set; } [Required(ErrorMessage = "Please enter day")] [Range(1, 31, ErrorMessage = "Day must be between 1 and 31")] public int Day { get; set; } [Required(ErrorMessage = "Please enter month")] [Range(1, 31, ErrorMessage = "Month must be between 1 and 12")] public int Month { get; set; }
Html呈现:
<input class="tooltip form-control input dob--input input-validation-error" data-val="true" data-val-number="The field Year must be a number." data-val-range="Year must be between 1900 and 1965" data-val-range-max="1965" data-val-range-min="1900" data-val-required="Please enter year" id="Year" maxlength="4096" name="Year" placeholder="YYYY" tabindex="" type="text" value="0">