2014-02-14 10 views
15

Gibt es eine Standardvalidierung für MVC 5, bei der ich den Mindest- und Höchstwert des Datums festlegen kann?MVC-Modellvalidierung für das Datum

In meinem Modell möchte ich Datum Validierung

public class MyClass 
    {    
     [Required(ErrorMessage="Start date and time cannot be empty")] 
     //validate:Must be greater than current date 
     [DataType(DataType.DateTime)] 
     public DateTime StartDateTime { get; set; } 

     [Required(ErrorMessage="End date and time cannot be empty")] 
     //validate:must be greater than StartDate 
     [DataType(DataType.DateTime)] 
     public DateTime EndDateTime { get; set; }    
    } 

Ps: Nach diesem Asp.Net Website gibt es ein Problem ist, das Range Validator für Datetime in Verwendung, und es wird nicht empfohlen.

Hinweis: Die jQuery-Validierung funktioniert nicht mit dem Range-Attribut und DateTime. Beispielsweise wird der folgende Code immer einen Fehler Clientseite Validierung angezeigt werden, auch wenn das Datum im angegebenen Bereich liegt:

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

Sie müssen jQuery Datum Validierung deaktivieren mit dem Range-Attribut zu verwenden, Terminzeit. Es ist in der Regel keine gute Übung, harte Daten in Ihren Modellen zu kompilieren, daher wird die Verwendung des Range-Attributs und von DateTime von abgeraten.

auch weiß ich, dass gibt es Nuget Pakete wie Fluent Validation und Foolproof, die den Trick für die Validierung und Überprüfung tut, wenn ein Datum größer als die anderen ist, aber ich wollte, wenn standardmäßig weiß, dass es etwas ist, das Datum ist zu prüfen, Min- und Max-Wert.

Von was ich in Whats new in MVC 5.1 sah, gibt es Unterstützung für MaxLength und MinLength Validierung.

+0

Sie könnten einen [benutzerdefinierten Validator] machen (http://stackoverflow.com/questions/27182606/asp-mvc-5-client-validation-for-range-of- Datumsangaben? noredirect = 1 & lq = 1) – Shadetheartist

+0

http://stackoverflow.com/questions/40543473/range-limt-for-datetime-and-date-field-in-mvc/40544222#40544222 siehe diese Antwort –

Antwort

-3

Ich denke, das Hinzufügen nur das Attribut „Range“ wird funktionieren

[Range(typeof(DateTime), "01/01/1900", "06/06/2079", ErrorMessageResourceType = typeof(Resources.Patient), ErrorMessageResourceName = "DateOfBirth_Range")] 
+7

Wenn Sie diese Website asp.net/mvc/ tutorials/mvc-5/introduction/adding-validation es heißt '" Hinweis: jQuery Validierung funktioniert nicht mit dem Range-Attribut und DateTime. Der folgende Code wird beispielsweise immer einen clientseitigen Validierungsfehler anzeigen, auch wenn das Datum im angegebenen Bereich liegt: [Range (typeof (DateTime), "1/1/1966", "1/1/2020"]] Sie müssen die jQuery-Datumsvalidierung deaktivieren, um das Range-Attribut mit DateTime zu verwenden. Es ist in der Regel keine gute Methode, harte Daten in Ihren Modellen zu kompilieren, daher wird davon abgeraten, das Range-Attribut und DateTime zu verwenden. "' – Cybercop

3

Ich würde tun dies mit der IValidatableObject Schnittstelle von System.ComponentModel.DataAnnotations, die Sie zusätzliche Validierungsregeln hinzufügen können, wo Sie tun können viel mehr Überprüfung. Fügen Sie die Schnittstelle zu Ihrer Klasse hinzu, und implementieren Sie dann die Methode Validate, in der Sie die StartDateTime mit dem aktuellen Datum/der aktuellen Uhrzeit vergleichen und die EndDateTime mit der StartDateTime vergleichen können, z.

public class MyClass : IValidatableObject 
{    
    [Required(ErrorMessage="Start date and time cannot be empty")] 
    //validate:Must be greater than current date 
    [DataType(DataType.DateTime)] 
    public DateTime StartDateTime { get; set; } 

    [Required(ErrorMessage="End date and time cannot be empty")] 
    //validate:must be greater than StartDate 
    [DataType(DataType.DateTime)] 
    public DateTime EndDateTime { get; set; }  

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     List<ValidationResult> results = new List<ValidationResult>(); 

     if (StartDateTime < DateTime.Now) 
     { 
      results.Add(new ValidationResult("Start date and time must be greater than current time", new []{"StartDateTime"})); 
     } 

     if (EndDateTime <= StartDateTime) 
     { 
      results.Add(new ValidationResult("EndDateTime must be greater that StartDateTime", new [] {"EndDateTime"})); 
     } 

     return results; 
    }  
} 

Der einzige mögliche Nachteil ist, dass Validate läuft serverseitige, nicht in jQuery Validierung.

0

Normalerweise verwende ich diese Lösung, wenn ich etwas im Server validieren möchte. Ich weiß, dass Sie sich auf das Validierungsmodell verlassen können, das MVC verwendet, aber wenn ich die Validierungen mache, versuche ich ein separates Projekt zu verwenden, falls ich einen Komponententest für sie machen muss. Nehmen wir an, Sie haben zwei Anwendungen, einen Desktop und ein Web, dann können beide das ValidationProject teilen, anstatt den Code in beiden Anwendungen für die gleiche "Ansicht"/"Bildschirm" zu wiederholen. Die Idee hier ist, das Validierungsprojekt als eigenständiges Projekt Ihrer Lösung zu isolieren.

So können Sie FluentValidation Projekt von NuGet herunterladen, FluentValidation verwendet Regeln innerhalb des Konstruktors, können Sie die Dokumentation hier sehen https://github.com/JeremySkinner/FluentValidation/wiki

Datum der Regel zum Beispiel ont diese Weise verwendet werden können, dort können Sie Regeln setzen für Ihre min-Wert und Ihr auch max-Wert:

public class CustomerValidator: AbstractValidator<Customer> { 
    public CustomerValidator() { 
        RuleFor(customer => customer.startDate) 
        .NotNull() 
        .WithMessage("You should select a start date") 
        .Must(d => d.HasValue && d.Value <= DateTime.Today) 
        .WithMessage("The start date should not be greather than current month/year"); 
    } 

Jetzt in Ihrem Controller

[HttpPost] 
public ActionResult Index(Customer c) 
{ 
    if(ModelState.IsValid) 
    { 
    var validator= new CustomerValidator(); 
    var valResult = validator.Validate(c); 

    if (valResult.Errors.Count != 0) 
    { 
     valResult.Errors.ForEach(x => ModelState.AddModelError(x.PropertyName, x.ErrorMessage)); 
     return View(vm); 
    } 

    //Your code here 
    } 
} 
2

Es gibt keine nee d, um die jQuery-Datumsvalidierung zu deaktivieren (und wahrscheinlich andere Probleme verursachen). Sie müssen nur die range Methode der $.validator überschreiben.

arbeitet standardmäßig mit numerischen Werten (und dann in einen String-Vergleich fällt zurück), so dass Sie das folgende Skript hinzufügen können (nach jquery.validate.js und jquery.validate.unobtrusive.js, aber Sie in $(document).ready

$.validator.methods.range = function(value, element, param) { 
    if ($(element).attr('data-val-date')) { 
     var min = $(element).attr('data-val-range-min'); 
     var max = $(element).attr('data-val-range-max'); 
     var date = new Date(value).getTime(); 
     var minDate = new Date(min).getTime(); 
     var maxDate = new Date(max).getTime(); 
     return this.optional(element) || (date >= minDate && date <= maxDate); 
    } 
    // use the default method 
    return this.optional(element) || (value >= param[ 0 ] && value <= param[ 1 ]); 
}; 

dann nicht umgebrochen können Sie die RangeAttribute auf Ihrem Grundstück

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")] 
public DateTime Date { get; set; } 
+0

Dies sollte als akzeptierte Antwort markiert werden. Danke Stephen! – ClownCoder

Verwandte Themen