2012-04-13 5 views
1

einfache benutzerdefinierte Validierung,MVC3 einfache benutzerdefinierte Validierung

mein Modell und benutzerdefinierte Validierung:

public class Registration 
{ 
    [Required(ErrorMessage = "Date of Birth is required")]   
    [AgeV(18,ErrorMessage="You are not old enough to register")] 
    public DateTime DateOfBirth { set; get; } 
} 

public class AgeVAttribute : ValidationAttribute 
{ 
    private int _maxAge; 

    public AgeVAttribute(int maxAge) 
    { 
     _maxAge = maxAge; 
    } 

    public override bool IsValid(object value) 
    { 
     return false;  <--- **this never gets executed.... what am I missing?** 
    } 
} 

(Bitte beachten Sie die Inline-Kommentar oben)

Ansicht:

@using (Html.BeginForm()) { 
@Html.ValidationSummary("Errors") 
<fieldset> 
    <legend>Registration</legend> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.DateOfBirth) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.DateOfBirth)  
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
</fieldset> 
} 
+1

Was ist Ihr Controller, der das Modell aussehen empfängt? –

+1

Ich habe Ihren Code in einem leeren MVC-Projekt und der Aufruf von IsValid versucht geschieht, wie es sollte. – Iridio

+0

Würden Sie die Methode 'action' angeben, in der das Modell des Typs 'Registrierung' verwendet wird? Ich habe Ihren Code getestet, er funktioniert auf der Serverseite. Da Ihr 'AgeVAttribute' IClientValidatable nicht implementiert, ist die clientseitige Validierung deaktiviert. – Kibria

Antwort

2

Can Keine Wiederholung.

Modell:

public class Registration 
{ 
    [Required(ErrorMessage = "Date of Birth is required")] 
    [AgeV(18, ErrorMessage = "You are not old enough to register")] 
    public DateTime DateOfBirth { set; get; } 
} 

public class AgeVAttribute : ValidationAttribute 
{ 
    private int _maxAge; 

    public AgeVAttribute(int maxAge) 
    { 
     _maxAge = maxAge; 
    } 

    public override bool IsValid(object value) 
    { 
     return false; 
    } 
} 

Controller:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new Registration 
     { 
      DateOfBirth = DateTime.Now.AddYears(-10) 
     }); 
    } 

    [HttpPost] 
    public ActionResult Index(Registration model) 
    { 
     return View(model); 
    } 
} 

Ausblick:

@model Registration 

@using (Html.BeginForm()) 
{ 
    @Html.ValidationSummary("Errors") 
    <fieldset> 
     <legend>Registration</legend> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.DateOfBirth) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.DateOfBirth)  
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

Die IsValid Methode wird immer getroffen, wenn das Formular abgeschickt wird. Beachten Sie auch, dass ich nicht aktivierte Client-seitige Validierung, weil ich nicht die jquery.validate.js und die jquery.validate.unobtrusive.js Skripte enthalten waren. Wenn Sie sie aufgenommen haben und es gibt eine Fehler stehen die Chancen, dass die Client-seitige Validierung Formular verhindern von selbst an den Server gesendet wird, in welchem ​​Fall es normal, dass die IsValid Methode nicht aufgerufen werden würde.

+0

thx Darin, einmal stellte ich [Httppost] public Action Index (Registration-Modell) { return View (Modell); } wurde die IsValid-Methode ausgeführt. Wenn es nicht schwierig ist, könnten Sie mir bitte zeigen, wie würde ich die Überprüfung mit clientseitigem Validieren durchführen, statt serverseitig Danke für Ihre Hilfe zu tun – Ben

+0

Sie könnten Ihr benutzerdefiniertes Validierungsattribut die 'IClientValidatable'-Schnittstelle implementieren und dann einen benutzerdefinierten Adapter registrieren Dies stellt eine JavaScript-Funktion dar, die Sie benötigen, um dieselbe Validierungslogik auf dem Server zu schreiben und zu replizieren. Hier ein Beispiel: http://stackoverflow.com/a/4747466/29407 –

+0

Hallo Darin, ich habe das Beispiel überprüft das du gepostet hast, alles ist klar bis ich zum letzten Teil komme (definiere den benutzerdefinierten Adapter) Könntest du mir bitte zeigen wie würden Sie die Altersbeschränkung (custom-Adapter) implementieren, ich am Beispiel sehe ich see.test() -Methode, nicht sicher, was tut .. wenn du mir erklären könnte, dass wieder genial dank wäre. – Ben