0 votes

Validation MVVM Silverlight dans un DataForm

J'utilise des classes de données génériques, je ne peux donc pas utiliser les attributs des services ria pour contrôler ma validation. Je cherche donc un moyen de configurer manuellement la validation pour qu'elle fonctionne dans un DataForm.

public partial class DataValue 
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        public Dictionary<string, string> Errors
        {
            get { return _errors; }
        }

        public Object Value
        {  
            get 
            {
                object result = new object();
                switch ((DataType)this.ModelEntity.ModelItem.DataType)
                {
                    case DataType.Money: 
                        return result = this.ValueText.ParseNullableFloat(); 
                    case DataType.Integer: 
                        return result = this.ValueText.ParseNullableInt();
                    case DataType.Date:                        
                    case DataType.Time:
                        return result = this.ValueText.ParseNullableDateTime();
                    case DataType.CheckBox:
                        return result = this.ValueText;
                    default:
                        return result = this.ValueText;
                }                
            }

            set
            {
                if (!String.IsNullOrEmpty(value.ToString()))
                {
                    bool invalid = false;
                    switch ((DataType)this.ModelEntity.ModelItem.DataType)
                    {
                        case DataType.Money:
                            float val;
                            if (!float.TryParse(value.ToString(), out val)) invalid = true;
                            break;
                        case DataType.Integer:
                            int val2;
                            if (!Int32.TryParse(value.ToString(), out val2)) invalid = true;
                            break;
                        case DataType.Date:
                        case DataType.Time:
                            DateTime val3;
                            if (!DateTime.TryParse(value.ToString(), out val3)) invalid = true;
                            break;
                    }
                    if (invalid == false)
                        ValueText = value.ToString();
                    else
                    {
                        ValueText = "";
                        _errors.Add(this.ModelEntity.LocalName, "error writing " + value.ToString() + " to " + this.ModelEntity.ModelItem.Label);
                    }
                }
                else
                    ValueText = "";

            }
        }

public partial class ModelValidater : INotifyPropertyChanging, INotifyPropertyChanged {

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _ModelValidatorId;

    private int _ModelEntityId;

    private int _ValidatorType;

    private string _ValidatorParameters;

Ainsi, en ASP MVC, je vérifiais simplement manuellement ces règles lorsque le formulaire était soumis... ce qui, je suppose, est à peu près ce que je veux faire en MVVM (je ne suis simplement pas sûr de la meilleure façon de procéder).

Code ASP

protected bool ModelErrors(RecordDictionary record)
        {
            bool result = false;
            foreach (var field in record)
            {
                foreach (var error in field.Value.Errors)
                {
                    result = true;
                    ModelState.AddModelError(error.Key + "Validation", error.Value.ToString());
                }
            }
            return result;
        }

0voto

JustinAngel Points 13219

La validation intégrée de Silverlight 3 est basée sur les exceptions.

Il suffit de lancer une exception significative dans votre Setter générique et tout devrait bien se passer. N'oubliez pas de définir ValidatesOnException=True et NotifyOnValidationError=True sur votre {Binding}.

Jesse a un bon échantillon de validation avec des exceptions sur son blog.

0voto

Shimmy Points 23393

Vous pouvez joindre les attributs de validation à l'aide de l'élément MetadataTypeAttribute attribut.
RIA Services générera automatiquement ces validations sur le client pour vous une fois qu'elles seront exposées dans le DomainService.

Exemple :

[MetadataType(typeof(ContactMd))]
public partial class Contact
{
    internal class ContactMd
    {
        [MyCustomValidation]
        public string Name { get; set; }
    }
}

( MyCustomValidation fait référence à tout ce qui hérite de ValidationAttribute ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X