2009-07-03 5 views
6

Je me demande comment utiliser Model Binding dans un scénario où je renvoie des informations de plusieurs entités sur une page?MVC - Liaison de modèle avec plusieurs entités sur la même page

Je souhaite afficher une combinaison de champs provenant de deux entités distinctes, à savoir Client + Adresse. J'utilise DAAB et les entités commerciales personnalisées de Microsoft pour mon modèle.

Des idées?

+1

Ceci est un doublon, im assez sûr. Créez un objet Modèle avec des propriétés publiques pour vos objets Client et Adresse. –

Répondre

20

Si vous essayez de lier à plusieurs modèles sur postback, vous devriez essayer d'utiliser l'attribut Bind et en spécifiant les préfixes utilisés pour chaque modèle dans vos arguments. Dans certains scénarios - où vous ne pouvez pas utiliser des préfixes séparés pour vos éléments de modèle - vous pourriez trouver cela plus facile à faire avec plusieurs TryUpdateModel et des listes blanches distinctes plutôt que de placer les modèles dans les paramètres.

public ActionResult Update([Bind(Prefix="Customer")]Customer customer, 
          [Bind(Prefix="Address")]Address address) 
{ 
    ... 
} 

Cela vous assumez avez un ViewModel comme:

public class CustomerAddressModel 
{ 
    public Customer Customer { get; set; } 
    public Address Address { get; set; } 
} 

et référencer comme:

<%= Html.TextBox("Customer.Name") %> 
... 
<%= Html.TextBox("Address.Street") %> 

ou, en utilisant TryUpdateModel,

public ActionResult Update(int id) 
{ 
    var customer = db.Customers.Where(c => c.ID == id).Single(); 

    var whitelist = new string[] { "name", "company", ... }; 
    if (TryUpdateModel(customer, whitelist)) 
    { 
     var addressWhitelist = new string[] { "street", "city", ... }; 
     if (TryUpdateModel(customer.Address, addressWhitelist)) 
     { 
      ... 
     } 
    } 

}

Dans ce cas, votre modèle peut contenir uniquement les champs des deux modèles différents que vous essayez de mettre à jour.

public class CustomerAddressModel 
{ 
    public string Name { get; set; } 
    public string Company { get; set; } 
    public string Street { get; set; } 
    ... 
} 
+0

+ mais peut-être "essayer/attraper avec UpdateModel" est mieux que ce "imbriqué si (TryUpdateModel" construction? –

+0

@ eu-ge-ne - peut-être.Cela dépendra de la façon dont vous gérez la mise à jour de l'état du modèle sans écrire les tests pour le code, il est difficile de dire exactement ce qu'il faut faire. – tvanfosson

-4

Vous pouvez utiliser ViewData pour transmettre plusieurs modèles à une vue.

SomeControllerMethod() 
{ 
    ... 
    ViewData["Customer"] = myCustomer; 
    ViewData["Address"] = myAddress; 
} 

Et la vue:

Customer name: <%= (ViewData["Customer"] as Customer).Name %> 
Street: <%= (ViewData["Address"] as Address).Street %> 
+0

Cela passe plusieurs objets à la vue, ils ne sont pas des modèles, vous ne serez pas en mesure d'accéder à leurs propriétés à travers l'objet Modèle de vues. –

+0

Utiliser un modèle de vue –

1

La réponse courte est:

  1. Construisez votre ViewModel en utilisant les objets de domaine que vous souhaitez des informations sur,
  2. Utilisez ensuite @model<ViewModel type> comme la première ligne de votre vue.

Vous avez maintenant fortement saisi votre vue et avez accès à toutes les propriétés des DEUX objets du domaine.

Questions connexes