Obtenir les atsortingbuts d’annotation de données du modèle

Je souhaite créer un validateur personnalisé côté client, mais je souhaite définir des règles de validation via les atsortingbuts des annotations de données au niveau de la couche de logique applicative. Comment puis-je accéder aux atsortingbuts de validation de modèle au moment de l’exécution?

Je veux écrire ‘générateur’, qui convertira ce code:

public class LoginModel { [Required] [MinLength(3)] public ssortingng UserName { get; set; } [Required] public ssortingng Password { get; set; } } 

dans celui-ci:

 var loginViewModel= { UserName: ko.observable().extend({ minLength: 3, required: true }), Password: ko.observable().extend({ required: true }) }; 

Mais pas à partir de sources .cs, bien sûr. =)

Peut-être reflection?

UPD

J’ai trouvé cette méthode: MSDN . Mais je ne comprends pas comment l’utiliser.

    Voici le moyen universel de procéder:

     private ssortingng GenerateValidationModel() { var name = typeof(T).Name.Replace("Model", "ViewModel"); name = Char.ToLowerInvariant(name[0]) + name.Subssortingng(1); var validationModel = "var " + name + " = {\n"; foreach (var prop in typeof(T).GetProperties()) { object[] attrs = prop.GetCustomAtsortingbutes(true); if (attrs == null || attrs.Length == 0) continue; ssortingng conds = ""; foreach (Atsortingbute attr in attrs) { if (attr is MinLengthAtsortingbute) { conds += ", minLength: " + (attr as MinLengthAtsortingbute).Length; } else if (attr is RequiredAtsortingbute) { conds += ", required: true"; } // ... } if (conds.Length > 0) validationModel += Ssortingng.Format("\t{0}: ko.observable().extend({{ {1} }}),\n", prop.Name, conds.Trim(',', ' ')); } return validationModel + "};"; } 

    Usage:

     ssortingng validationModel = GenerateValidationModel(); 

    Sortie:

     var loginViewModel = { UserName: ko.observable().extend({ minLength: 3, required: true}), Password: ko.observable().extend({ required: true}), }; 

    C’est une bonne idée de mettre en cache la sortie

    Comme indiqué ci-dessus, je pense que le T4 pourrait valoir le coup. Un énorme avantage est qu’elle n’est pas exécutée au moment de l’exécution (bien que cela puisse être le cas, si vous le souhaitez) et que vous pouvez éviter tous les problèmes possibles liés à la génération de fichiers d’exécution. J’espère un sharepoint départ suffisant:

     <#@ template language="C#" debug="True" hostspecific="true" #> <#@ output extension="js" #> <#@ assembly name="System.Core" #> <#@ assembly name="EnvDTE" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.Linq" #> <#@ import namespace="EnvDTE" #> <# var serviceProvider = Host as IServiceProvider; if (serviceProvider == null) { throw new InvalidOperationException("Host is not IServiceProvider"); } var dte = serviceProvider.GetService(typeof(DTE)) as DTE; if (dte == null) { throw new InvalidOperationException("Unable to resolve DTE"); } var project = dte.Solution.Projects .OfType() .Single(p => p.Name == "ConsoleApplication2"); var model = project.CodeModel .CodeTypeFromFullName("MyApp.LoginModel") as CodeClass; //might want to have a list / find all items matching some rule #> var <#= Char.ToLowerInvariant(model.Name[0]) + model.Name.Remove(0, 1).Replace("Model", "ViewModel") #>= { <# foreach (var property in model.Members.OfType()) { var minLength = property.Atsortingbutes .OfType() .FirstOrDefault(a => a.Name == "MinLength"); var required = property.Atsortingbutes .OfType() .FirstOrDefault(a => a.Name == "Required"); var koAtsortingbutes = new List(); if (minLength != null) koAtsortingbutes.Add("minLength: " + minLength.Value); if (required != null) koAtsortingbutes.Add("required: true"); #> <#= property.Name #>: ko.observable().extend({<#= String.Join(", ", koAttributes) #>}), <# } #> }