web-dev-qa-db-fra.com

Besoin d'une ligne guide pour la méthode d'action MVC avec l'attribut Bind

Je parcourais un code de méthode d'action et j'ai vu qu'un attribut y était utilisé mais je ne comprenais vraiment pas l'utilisation. voici le code

public ActionResult User([Bind(Include = "Username,FullName,Email")]User user)
{
   if (!ModelState.IsValid()) return View(user);

   try
   {
     user.save()
     // return the view again or redirect the user to another page
   }
   catch(Exception e)
   {
     ViewData["Message"] = e.Message;
     return View(user)
   }
}

([Bind(Include = "Username,FullName,Email")]User user)

je ne comprends tout simplement pas la ligne ci-dessus

alors s'il vous plaît, aidez-moi à comprendre ce type d'attribut utilisé et quand les gens écrivent ce type de code en mvc. ce sera vraiment une bonne aide si quelqu'un me fait comprendre avec un exemple de petit code où ils utiliseront ce Bind attribute.

Mise à jour: Supposons que j'ai un formulaire à partir duquel l'utilisateur ne peut entrer que FirstName, LastName & Gender alors ma méthode d'action ressemble à

public ActionResult Edit(string FirstName,string LastName,string Gender)
{
    // ...
}

cela fonctionnera je pense. alors pourquoi je devrais utiliser un attribut Bind parce que ma méthode d'action ci-dessus fonctionnera bien.

50
Thomas

L'attribut Bind vous permet "d'affiner" le processus de liaison de modèle de certains Type de paramètre, sans enregistrer un ModelBinder personnalisé spécifique au Type.

Par exemple, supposons que votre action attend un paramètre Person défini comme suit:

public class Person
{
    public Person(string firstName, string lastName, Gender gender)
    {
        this.FirstName = firstName;
        this.LastName = lastName;

        if (gender == Gender.Male)
            this.FullName = "Mr. " + this.FirstName + " " + this.LastName;
        else
            this.FullName = "Mrs. " + this.FirstName + " " + this.LastName;
    }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Gender Gender { get; set; }

    // 'FullName' is a computed column:
    public string FullName { get; set; }
}

Et l'action:

public ActionResult Edit(Person person)
{
    ...
}

Maintenant, si quelqu'un publie le JSON suivant:

{
    "FirstName":"John",
    "LastName":"Smith",
    "Gender":"Male",
    "FullName":"Mrs. John Smith"
}

Votre action aura maintenant un person avec le mauvais FullName ('Mme' au lieu de 'Mr').

Pour éviter un tel comportement, vous pouvez utiliser l'attribut Bind et exclure explicitement la propriété FullName du processus de liaison ('Black-list'):

public ActionResult Edit([Bind(Exclude="FullName")] Person person)
{
    ...
}

Alternativement, vous pouvez utiliser Include pour ignorer ('Black-list') toutes les propriétés et inclure uniquement ('White-list') les propriétés spécifiées:

public ActionResult Edit([Bind(Include="FirstName,LastName,Gender")] Person person)
{
    ...
}

Plus d'informations sur MSDN .

85
haim770

Lorsque cette action est exécutée, le classeur de modèle MVC utilisera les paramètres de requête pour remplir les propriétés du paramètre user, comme vous le savez peut-être déjà. Cependant, l'attribut Bind indique au classeur de modèle de uniquement remplir les propriétés avec les noms spécifiés.

Dans ce cas, seules les propriétés Username, FullName et Email seront remplies. Tous les autres seront ignorés.

Voir ici pour plus de détails: http://ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explicitly/

16
greg84

L'attribut Bind est un moyen de se protéger contre la sur-publication dans les scénarios de création. Par exemple, supposons que l'entité Student inclut une propriété Secret que vous ne souhaitez pas que cette page Web définisse.

public class Student
{
  public int ID { get; set; }
  public string LastName { get; set; }
  public string FirstMidName { get; set; }
  public DateTime EnrollmentDate { get; set; }
  public string Secret { get; set; }

  public virtual ICollection<Enrollment> Enrollments { get; set; }
}

Même si vous n'avez pas de champ Secret sur la page Web, un pirate pourrait utiliser un outil tel que violoneux ou écrire du JavaScript pour publier une valeur de formulaire Secret. Sans l'attribut Bind limitant les champs que le classeur de modèle utilise lorsqu'il crée une instance Student, le classeur de modèle récupère cette valeur de formulaire Secret et l'utilise pour créer l'instance d'entité Student. Ensuite, quelle que soit la valeur que le pirate spécifié pour le champ du formulaire secret serait mise à jour dans votre base de données. L'image suivante montre l'outil violoniste ajoutant le champ Secret (avec la valeur "OverPost") aux valeurs de formulaire publiées. La valeur "OverPost" serait ensuite ajoutée avec succès à la propriété Secret de la ligne insérée, bien que vous n'ayez jamais voulu que la page Web puisse définir cette propriété.

Il est recommandé d'utiliser le paramètre Include avec l'attribut Bind pour ajouter des champs à la liste blanche. Il est également possible d'utiliser le paramètre Exclure pour mettre sur liste noire les champs que vous souhaitez exclure. La raison pour laquelle Inclure est plus sécurisé est que lorsque vous ajoutez une nouvelle propriété à l'entité, le nouveau champ n'est pas automatiquement protégé par une liste d'exclusion.

2
user5967438