2012-05-06 4 views
3

Mon projet web actuel dispose d'une interface d'administration, dans laquelle les détails d'un utilisateur peuvent être édités (pas vraiment révolutionnaire, j'avoue ...). La vue utilise un modèle fortement typé d'un utilisateur, avec des attributs de validation:Validez uniquement les entrées sales

public class UserPrototype 
{ 
    [Required] 
    [StringLength(50, MinimumLength = 4)] 
    public string Username { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1] 
    public string LastName { get; set; } 

    [Required] 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 

    /* 
     And so on 
    */ 
} 

Lorsque l'utilisateur est mis à jour, je voudrais mettre à jour uniquement dans la base de données les champs qui ont réellement changé. La raison principale est le champ de mot de passe - le mot de passe est bien sûr stocké comme un hachage, donc quand l'utilisateur est récupéré pour l'édition il n'y a rien de significatif à afficher dans ce champ. Mais la validation du classeur modèle nécessite un mot de passe valide. Donc, est-ce que je peux toujours utiliser la même classe, mais en quelque sorte, ne validez que les champs qui ont été soumis comme modifiés (ce que je peux accomplir en javascript)? Je voudrais éviter de dupliquer la classe UserPrototype juste pour supprimer les attributs Required.

Répondre

1

Utilisez l'héritage, de cette façon vous n'avez pas à dupliquer.

public class BaseUserPrototype 
{ 
    [Required] 
    [StringLength(50, MinimumLength = 4)] 
    public string Username { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1] 
    public string LastName { get; set; } 

    /* 
     And so on 
    */ 
} 

public class NewUserPrototype: BaseUserPrototype 
{ 
    [Required] 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 

    /* 
     And so on 
    */ 
} 
public class EditUserPrototype: BaseUserPrototype 
{ 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 
    /* 
     And so on 
    */ 
} 
+0

Ah, mais je veux toujours qu'il soit * possible * de changer le mot de passe. Mais ne pas avoir à connaître le mot de passe et le ressaisir juste pour changer un autre paramètre ... – carlpett

+0

Mis à jour ma réponse. Dans le scénario d'édition, supprimez l'attribut requis. –

0

Vous pouvez utiliser l'interface IDataErrorInfo; Implémentez-le sur votre entité de cette façon:

public class Entity: IDataErrorInfo 
{ 
// this is the dictionary of errors 
    private readonly Dictionary<string, string> _errors = new Dictionary<string, string>(); 
    private string _password; 

    public string Password 
    { 
     get{return _password;} 
     set 
     { 
     // YOUR ACTUAL VALIDATION CODE HERE. IF THERE IS A VALIDATION ERROR - ADD IT TO THE DICTIONARY 
      if(string.IsNullOrEmpty(value)) 
      _errors["Password"] = "Error with password field"; 
     } 
    } 
} 
Questions connexes