2009-05-12 8 views
0

Je rencontre un problème avec l'attribut bind dans asp.net mvc. J'ai un ViewModel personnalisé qui ressemble à ceci:Liaison de modèle de type générique et BindAttribute

public interface IUserView<TUser> where TUser : User 
{ 
    TUser User { get; set; } 
    string Email { get; set; } 
    string ConfirmEmail { get; set; } 
    string Password { get; set; } 
    string ConfirmPassword { get; set; } 
} 
public class EditUserView<TUser> : IUserView<TUser> where TUser : User 
{ 
    public virtual TUser User { get; set; } 

    [ValidateRegExp(RegexConstants.Email, "Invalid Email.")] 
    [ValidateNonEmpty("email is required.")] 
    public virtual string Email { get; set; } 

    [ValidateSameAs("Email", "confirmation email does not match.")] 
    public virtual string ConfirmEmail { get; set; } 


    public virtual string Password { get; set; } 

    [ValidateSameAs("Password", "confirmation password does not match.")] 
    public virtual string ConfirmPassword { get; set; } 
} 

et une méthode pour soumettre ce qui ressemble à ceci:

public ActionResult SubmitProfile([Bind(Exclude="IsSystemAdmin")]EditUserView<Admin> iuserview) 

si vous regardez la méthode ci-dessus, vous remarquerez l'attribut de liaison avec 'Exclude = "IsSystemAdmin"'. Le modèle admin a une propriété booléenne nommée "IsSystemAdmin" qui augmente leur niveau d'autorisation. Maintenant, évidemment, je ne veux pas qu'un admin soit capable de se faire un administrateur système juste en affichant une vraie valeur pour ce champ.

J'ai essayé "IsSystemAdmin" et "User.IsSystemAdmin" dans la propriété exclude et aucun d'entre eux n'arrête la mise à jour de la variable IsSystemAdmin. Existe-t-il un moyen de faire fonctionner l'attribut bind dans ce scénario ou s'agit-il d'un bogue dans le classeur Modèle par défaut?

Répondre

1

Avez-vous essayé d'utiliser l'attribut Bind sur la classe TUser se

[Bind(Exclude = "IsSysAdmin")] 
public class TUser 
{ 

} 

Je pense qu'en raison de l'importance de cette propriété, vous ne voudrez plus jamais que cela soit fixé par un liant modèle et donc la liaison sur la classe ira bien. Vous augmentez probablement un Admin à sysadmin en définissant explicitement le drapeau sur une action.

Je suis très méfiant de lier les classes Model directement à partir des messages de formulaire. J'ai des classes de formulaire spécifiques pour les classes de modèle bind et update dans ma couche de référentiel uniquement via une autre couche de service.

Questions connexes