Проверка ASP.net: почему мои поля DateTime также помечаются как обязательные?

Я реализую валидацию в своем веб-приложении... проблема в том, что она кажется чрезмерно валидированной?!

Код контроллера выглядит так:

[HttpPost]
[Authentication]
public ActionResult Create([Bind(Exclude = "Id")] CaseInfo caseInfo)
{
    if (!ModelState.IsValid)
    {
        SetupViewData();
        return View();
    }

    _repository.Create(caseInfo);
    return RedirectToAction("List");
}

Это реализация CaseInfo:

public class CaseInfo :IValidatableObject
{   
    public virtual Guid Id { get; set; }
    public virtual DateTime ReferralDate { get; set; }
    public virtual int Decision { get; set; }
    public virtual string Reason { get; set; }
    public virtual DateTime StartDate { get; set; }
    public virtual DateTime EndDate { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        throw new NotImplementedException();
    }
}

И мой CaseInfoMap:

public sealed class CaseInfoMap : ClassMap<CaseInfo>
{
    public CaseInfoMap()
    {
        Id(x => x.Id).Not.Nullable();
        Map(x => x.ReferralDate);
        Map(x => x.Decision);
        Map(x => x.Reason);
        Map(x => x.StartDate);
        Map(x => x.EndDate);
    }
}

Но когда я запускаю его и отправляю форму без значений, я получаю следующие ошибки проверки:

# The ReferralDate field is required.
# The StartDate field is required.
# The EndDate field is required.

Но я не уточнил, что это необходимо?!! И почему поля решений и причин не выдают одинаковые ошибки проверки?

Может кто-нибудь пролить некоторый свет на это?

Я использую.NET 4 и MVC 2.

2 ответа

Решение

Не могли бы вы изменить это:

public virtual DateTime ReferralDate { get; set; } 

в

public virtual DateTime? ReferralDate { get; set; } 

Вам нужно использовать обнуляемый тип для DateTime.

Если вы хотите сделать то же самое для всех других дат, измените их:

public class CaseInfo :IValidatableObject {        
    public virtual Guid Id { get; set; }     
    public virtual DateTime? ReferralDate { get; set; }     
    public virtual int Decision { get; set; } 
    public virtual string Reason { get; set; }     
    public virtual DateTime? StartDate { get; set; }     
    public virtual DateTime? EndDate { get; set; }      
    public IEnumerable<ValidationResult>

Validate (ValidationContextvalidationContext) {throw new NotImplementedException ();}}

Проверьте документацию MSDN по дате и времени: http://msdn.microsoft.com/en-us/library/system.datetime(v=VS.90).aspx

Вы заметите, что значения имеют диапазон, который не включает ноль, следовательно, ваш валидатор не работает. Вы захотите использовать обнуляемый тип datetime.

Структура DateTime не обнуляется, поэтому она обязательна. Вы должны использовать Nullable<DateTime> [или же DateTime? для краткости], если он обнуляем.

Другие вопросы по тегам