93 votes

Deux modèles en une vue dans ASP MVC 3

J'ai 2 modèles:

 public class Person
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }
}
public class Order
{
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}
 

Je veux éditer des objets des deux classes dans la vue UNIQUE, alors j'ai besoin de quelque chose comme:

 @model _try2models.Models.Person
@model _try2models.Models.Order

@using(Html.BeginForm())
{
    @Html.EditorFor(x => x.PersonID)
    @Html.EditorFor(x => x.PersonName)
    @Html.EditorFor(x=>x.OrderID)
    @Html.EditorFor(x => x.TotalSum)
}
 

Bien entendu, cela ne fonctionne pas: une seule instruction 'modèle' est autorisée dans un fichier .cshtml. Peut-être y a-t-il une solution de contournement?

123voto

Andi Points 5222

Créez un modèle de vue parent contenant les deux modèles.

 public class MainPageModel{
    public Model1 Model1{get; set;}
    public Model2 Model2{get; set;}
}
 

De cette façon, vous pouvez ajouter des modèles supplémentaires à une date ultérieure avec un minimum d'effort.

56voto

Hamid Points 921

Pour utiliser le tuple vous devez effectuer les opérations suivantes, dans la vue de modifier le modèle:

@model Tuple<Person,Order>

utiliser @html méthodes que vous devez faire ce qui suit, je.e:

@Html.DisplayNameFor(tuple => tuple.Item1.PersonId)

ou

@Html.ActionLink("Edit", "Edit", new { id=Model.Item1.Id }) |

Item1 indique le premier paramètre passé à la Tupel méthode et vous pouvez utiliser Item2 pour accéder à la deuxième et ainsi de suite.

dans votre contrôleur, vous devez créer une variable de type Tuple, puis passer à la vue:

    public ActionResult Details(int id = 0)
    {
        Person person = db.Persons.Find(id);
        if (person == null)
        {
            return HttpNotFound();
        }
        var tuple = new Tuple<Person, Order>(person,new Order());

        return View(tuple);
    }

Un autre exemple : Plusieurs modèles en vue

47voto

Bobson Points 7610

Une autre option qui ne nécessite pas de créer un modèle personnalisé consiste à utiliser un tuple <> .

 @model Tuple<Person,Order>
 

Ce n'est pas aussi propre que de créer une nouvelle classe qui contient les deux, selon la réponse d'Andi, mais c'est viable.

10voto

Steve Fenton Points 55265

Si vous êtes fan des modèles très plats, vous devez créer un modèle spécifique à cette vue pour supporter la vue ...

 public class EditViewModel
    public int PersonID { get; set; }
    public string PersonName { get; set; }
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}
 

De nombreuses personnes utilisent AutoMapper pour mapper leurs objets de domaine vers leurs vues à plat.

L'idée du modèle de vue est qu'il ne fait que soutenir la vue - rien d'autre. Vous en avez un par vue pour vous assurer qu'il ne contient que ce qui est requis pour cette vue, pas les charges de propriétés que vous souhaitez pour d'autres vues.

3voto

Michael Points 62

Créez simplement un modèle avec une vue contenant toutes les informations nécessaires. Normalement, je crée un modèle pour chaque vue afin que je puisse être spécifique à chaque vue, que ce soit ou créer un modèle parent et l'hériter. OU créer un modèle qui inclut les deux vues.

Personnellement, je voudrais simplement les ajouter à un modèle, mais c'est comme cela que je le fais:

 public class xViewModel
{
    public int PersonID { get; set; }
    public string PersonName { get; set; }
    public int OrderID { get; set; }
    public int TotalSum { get; set; }
}

@model project.Models.Home.xViewModel

@using(Html.BeginForm())
{
    @Html.EditorFor(x => x.PersonID)
    @Html.EditorFor(x => x.PersonName)
    @Html.EditorFor(x => x.OrderID)
    @Html.EditorFor(x => x.TotalSum)
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X