Legge runtime feilmeldinger til side validation

Et av kravene når du skriver dette området var evnen til å modellere objekt begrensninger i OCL og deretter validere den gjeldende siden mot disse begrensningene.
Problem med normale validatorer er at de er laget for å validere individuell kontroller i stedet for en liste av begrensninger på et objekt. Tilnærmingen jeg tok var å skape en validator som jeg kan plassere på alle webskjemaer og legge til så mange feil som jeg kreves
første skritt var å skape en WebControl som støttet IValidator
public class MultiValidator. WebControl, IValidator {}
jeg deretter lagt en Arraylist å holde feil strenger, og en metode for å legge til en feil
private Arraylist feil = new Arraylist ();.
public void AddError (streng beskjed) {feil. Legg til (melding); } //AddError
Når ASP .net validerer en side det nummerer alle IValidators innenfor sin egen validatorer eiendom, og kalte IValidator.Validate (). For å finne ut om siden er lovlig eller ikke sjekker så IValidator.IsValid
å legge til egendefinerte feilmeldinger under kjøring bestemte jeg meg for å lage en statisk validator klasse som alltid returnerer ". Falsk " fra IsValidator.IsValid. For hver feilmelding i mitt MultiValidator jeg kunne da bare opprette en forekomst av en av disse validatorer product: [ToolboxItem (false)] intern klasse StaticValidator. IValidator {private String Errormessage;
#region IValidator ugyldig IValidator.Validate ( ) {} //Valider
bool IValidator.IsValid {få {return false; } Satt {}} //IsValid #endregion
offentlig streng Errormessage {får {return Errormessage; } Satt {Errormessage = verdi; }} //Errormessage}
Nå som StaticValidator ble skrevet, var alt jeg trengte å gjøre var å legge de nødvendige IValidator implementeringer til min MultiValidator klasse.
#region IValidator ugyldig IValidator.Validate () {IsValid = (Errors.Count == 0); foreach (string feil i feil) {StaticValidator validator = new StaticValidator (); validator.ErrorMessage = feil; Page.Validators.Add (validator); Validators.Add (validator); } //foreach feil} //Valider
bool IValidator.IsValid {få {return IsValid; } Satt {IsValid = verdi; }} //IsValid #endregion
Innenfor en web-skjema, jeg ville nå


    Sett " CausesValidation " false på min send-knappen.

    validere mitt objekt

    Ring MultiValidator1.AddError () for hver feil oppstod

    Ring Page.Validate ()

    Sjekk Page.IsValid som normalt
    Ved hjelp av en ValidationSummary jeg kunne da vise ødelagte begrensninger til brukeren for utbedring. Hele kildekoden er oppført nedenfor ....
    MultiValidator.cs
    bruker System; hjelp System.Collections, ved hjelp System.ComponentModel, ved hjelp System.Web.UI, ved hjelp System.Web .UI.WebControls;
    navne DroopyEyes.Web.Controls {public class MultiValidator: WebControl, IValidator {#region medlemmer privat bool IsValid = true; private string Errormessage = " "; private Arraylist Feil = new Arraylist (); private Arraylist validatorer = new Arraylist (); #endregion
    #region IValidator ugyldig IValidator.Validate () {IsValid = (Errors.Count == 0); foreach (string feil i feil) {StaticValidator validator = new StaticValidator (); validator.ErrorMessage = feil; Page.Validators.Add (validator); Validators.Add (validator); } //foreach feil} //Valider
    bool IValidator.IsValid {få {return IsValid; } Satt {IsValid = verdi; }} //IsValid #endregion
    beskyttet ride void OnInit (EventArgs e) {base.OnInit (e); Page.Validators.Add (denne); }
    Beskyttet ride void onunload (EventArgs e) {if (Side = null) {Page.Validators.Remove (denne); foreach (IValidator validator i validatorer) Page.Validators.Remove (validator); } //Page = null
    base.OnUnload (e!); }
    Public void AddError (string melding) {Errors.Add (melding); } //AddError
    #region Properties [bind (true)] [Category (" Utseende ")] [Default (" ")] offentlig streng Errormessage {får {return Errormessage; } Satt {Errormessage = verdi; }} //Errormessage #endregion
    }}
    StaticValidator.cs
    bruker System; hjelp System.ComponentModel, ved hjelp System.Web.UI;
    navne DroopyEyes.Web. Controls {[ToolboxItem (false)] intern klasse StaticValidator: IValidator {private string Errormessage;
    #region IValidator ugyldig IValidator.Validate () {System.Diagnostics.Trace.WriteLine (" StaticValidator.Validate () "); } //Valider
    bool IValidator.IsValid {få {return false; } Satt {}} //IsValid #endregion
    offentlig streng Errormessage {får {return Errormessage; } Satt {Errormessage = verdi; }} //Errormessage}}