3

Ceci est un exemple que j'ai soulevé ici: http://aspalliance.com/1776_ASPNET_MVC_Beta_Released.5Ne comptez pas les propriétés sur le modèle de liaison en utilisant des interfaces

public ActionResult Save(int id) 
{ 
Person person = GetPersonFromDatabase(id); 
try 
{ 
    UpdateMode<IPersonFormBindable>(person) 
    SavePersonToDatabase(person); 

    return RedirectToAction("Browse"); 
} 
catch 
{ 
    return View(person) 
} 
} 

interface IPersonFormBindable 
{ 
string Name {get; set;} 
int Age {get; set;} 
string Email {get; set;} 
} 

public class Person : IBindable 
{ 
public string Name {get; set;} 
public int Age {get; set;} 
public string Email {get; set;} 
public Decimal? Salary {get; set;} 
} 

Ce ne sera pas la carte des valeurs à la propriété Salaire mais exécutera ses attributs de validation qui ne devrait pas lorsque vous faites la norme [Bind (Exclure = "Salaire")]

[Bind(Exclude="Salary")] 
public class Person 
{ 
public string Name {get; set;} 
public int Age {get; set;} 
public stiring Email {get; set;} 
public Decimal? Salary {get; set;} 
} 

Comment vais-je mettre en œuvre le [Bind (Exclure = "propriété")] utilisant ce modèle d'interface?

+0

Quelle est la question? :) – Lorenzo

+0

salut, je pensais que la question est déjà évidente. Voici la question pour vous. –

Répondre

2

Voici ce que je vous recommande: utiliser des modèles de vue, et abandonner ces interfaces, ne pas encombrer vos contrôleurs avec autant de code. Donc, vous n'avez pas besoin du salaire d'être lié à cette action spécifique: grand, utiliser un modèle de vue spécifiquement adapté à ce point de vue:

public class PersonViewModel 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public string Email { get; set; } 
} 

Et votre action de contrôleur:

public ActionResult Save(PersonViewModel person) 
{ 
    _repository.SavePersonToDatabase(person); 
    return RedirectToAction("Browse"); 

    // Notice how I've explicitly dropped the try/catch, 
    // you weren't doing anything meaningful with the exception anyways. 
    // I would simply leave the exception propagate. If there's 
    // a problem with the database it would be better to redirect 
    // the user to a 500.htm page telling him that something went wrong. 
} 

Si dans un autre action vous avez besoin du salaire, puis écrivez un autre modèle de vue spécifique à cette vue. Ne vous inquiétez pas si vous répétez certaines propriétés entre vos modèles de vue. C'est exactement ce à quoi ils sont destinés. Évidemment, votre référentiel fonctionnera avec un modèle et non un modèle de vue. Donc, vous aurez besoin de cartographier entre ces deux types. Je vous recommande d'utiliser AutoMapper à cette fin.

C'est mon point de vue: écrivez toujours des modèles de vue spécifiquement adaptés aux besoins d'une vue donnée. Essayez d'éviter ceux Inclure, Exclure ou un jour il va vous mordre, quelqu'un va ajouter une propriété sensible et oubliera de l'ajouter à la liste Exclure. Et même si vous avez utilisé Inclure c'est toujours moche.

+0

Où placez-vous la validation? sur le viewmodel ou sur le modèle de domaine? –

+1

@geocine, sur le modèle de vue, c'est ce que le contrôleur reçoit d'une vue, c'est ce que représente l'entrée de l'utilisateur, c'est là que le premier niveau de validation doit être effectué. Validation simple, comme les propriétés requises, les formats datetime, ... La validation métier comme si un utilisateur existe déjà dans le magasin de données doit être effectuée au niveau du service, qui est un deuxième niveau de validation. C'est ici que les règles métier sont validées. –