如果字段为空或错误,则为DateTime的RequiredAttribute

时间:2016-03-09 13:59:25

标签: c# asp.net-mvc-4

RequiredAttribute适用于string但适用于DateTime。例如:

    [Required]
    [DisplayFormat(ConvertEmptyStringToNull = false)]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.DateTime)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd-MMM-yyyy}", ConvertEmptyStringToNull = false)]
    public DateTime Birthdate { get; set; }

如果Name为空,则验证显示错误,但如果Birthdate为空,则表示没有任何反应。我看了看:

ASP MVC 5 Client Validation for Range of Datetimes

MVC Model Range Validator?

但仍不适用于DateTime

6 个答案:

答案 0 :(得分:2)

我认为DateTime有一个标准值,所以你应该添加一个范围属性

而不是必需的
[Range(typeof(DateTime), "01/01/1900", "01/01/2100", ErrorMessage="Date is out of Range")]
像这样的事情应该可以解决问题

答案 1 :(得分:2)

DateTime是一个结构,结构是#34;值类型",而不是"引用类型",所以它们的默认值不是null,对于{{ 1}}它是DateTime1/1/0001 12:00:00 AM的默认值为int

0类型是"引用类型",所有引用类型的默认值均为string

因此,如果您想检查值类型是否为null,则应将其创建为null

像这样:

Nullable

或者

public DateTime? Birthdate { get; set; }

答案 2 :(得分:1)

这是因为Birthdate属性不可为空,所以它总是有一个值,如果改为:

public Nullable<DateTime> Birthdate { get; set; }

然后必需的属性将按预期工作。

答案 3 :(得分:0)

如果您不想使DateTime可以为空,但仍然将默认值0001-01-01 12:00:00 AM(DateTime.MinValue)解释为&#34;缺少&#34;,只需创建自己的验证器:

public class RequiredDateTimeAttribute : ValidationAttribute
{
    public RequiredDateTimeAttribute()
    {
        ErrorMessage = "The {0} field is required";
    }

    public override bool IsValid(object value)
    {
        if (!(value is DateTime))
            throw new ArgumentException("value must be a DateTime object");

        if ((DateTime)value == DateTime.MinValue)
            return false;

        return true;
    }

    public override string FormatErrorMessage(string name)
    {
        return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name);
    }
}

答案 4 :(得分:0)

您可以在EditorTemplates和Date.cshtml中使用kendo ui组件,然后当默认日期为DateTime.Now

@using Kendo.Mvc.UI
@model DateTime?
    @if (Model.ToString() == "0001-01-01T00:00:00")
    {
        @Html.Kendo().DatePickerFor(m => m).Format("yyyy/MM/dd").HtmlAttributes(new {style = "width: 20em", type = "text" }).Value(DateTime.Now).Footer("Today -  #=kendo.toString(data, 'dddd  yyyy/MM/dd') #")
    }
    else
    {
        @Html.Kendo().DatePickerFor(m => m).Format("yyyy/MM/dd").HtmlAttributes(new {style = "width: 20em", type = "text"}).Value(Model).Footer("Today-  #=kendo.toString(data, 'dddd  yyyy/MM/dd') #")
    }

在viewmodel类中使用

[UIHint("Date")]
public DateTime CreateDate { get; set; }

答案 5 :(得分:0)

要扩展Axel Bouttelgier的答案,代码应如下所示:

服务器端代码

[Display(Name = "Disconnect Service")]
[Range(typeof(DateTime), "01/01/1900", "01/01/2100" )]
public DateTime Disconnect Service { get; set; }

查看代码

@Html.ValidationSummary()

验证如下所示: enter image description here