Проверка ASP.net: почему мои поля DateTime также помечаются как обязательные? - PullRequest
1 голос
/ 11 февраля 2011

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

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

[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 ]

3 голосов
/ 11 февраля 2011

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

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.

2 голосов
/ 11 февраля 2011

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

...