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 les objets des DEUX classes en vue UNIQUE, j'ai donc 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)
}
Ceci, bien sûr, ne fonctionne pas: une seule instruction 'model' est autorisée dans un fichier .cshtml. Peut-être existe-t-il une solution de contournement?
asp.net-mvc-3
viewmodel
Smarty
la source
la source
ViewBag
avec pour chaque vue a fonctionné pour moi, vérifiez ceci pour connaître plusieurs options, économisé peu de temps pour moi au lieu de créer un modèle de vue ou une vue partielleRéponses:
Créez un modèle de vue parent qui contient les deux modèles.
De cette façon, vous pouvez ajouter des modèles supplémentaires à une date ultérieure avec un minimum d'effort.
la source
Pour utiliser le tuple, vous devez effectuer les opérations suivantes, dans la vue, changez le modèle en:
pour utiliser les méthodes @html, vous devez procéder comme suit:
ou
Item1 indique le premier paramètre passé à la méthode Tuple et vous pouvez utiliser Item2 pour accéder au deuxième modèle et ainsi de suite.
dans votre contrôleur, vous devez créer une variable de type Tuple puis la passer à la vue:
Un autre exemple: plusieurs modèles dans une vue
la source
Tuple
dans ce cas - OP veut éditer des données, et aTuple
n'a pas de constructeur par défaut donc le modèle ne peut pas être lié lorsque le formulaire est soumisUne autre option qui n'a pas besoin de créer un modèle personnalisé consiste à utiliser un Tuple <> .
Ce n'est pas aussi clair que de créer une nouvelle classe qui contient les deux, selon la réponse d'Andi, mais c'est viable.
la source
@model
lignes distinctes ?@Model.Item1.Property
et@Model.Item2.Property
pourPerson
etOrder
respectivementSi vous êtes fan des modèles très plats, juste pour soutenir la vue, vous devez créer un modèle spécifique à cette vue particulière ...
De nombreuses personnes utilisent AutoMapper pour mapper les objets de leur domaine vers leurs vues à plat.
L'idée du modèle de vue est qu'il ne prend en charge que la vue - rien d'autre. Vous en avez une par vue pour vous assurer qu'elle ne contient que ce qui est requis pour cette vue, et non les nombreuses propriétés que vous souhaitez pour d'autres vues.
la source
ok, tout le monde a du sens et j'ai pris toutes les pièces et les ai mises ici pour aider les débutants comme moi qui ont besoin d'explications du début à la fin.
Vous créez votre grande classe qui contient 2 classes, selon la réponse de @ Andrew.
Ensuite, dans votre contrôleur, vous remplissez les 2 modèles. Parfois, il suffit d'en remplir un. Puis dans le retour, vous référencez le grand modèle et il emportera le 2 à l'intérieur avec lui à la vue.
En haut de la vue
Ensuite, chargez vos entrées ou affichages référençant le contenu des grands modèles:
Et. . . . de retour au ranch, lorsque la poste arrive, faites référence à la grande classe:
et utilisez ce que le ou les modèles ont renvoyé:
Avoir probablement des éléments de validation DataAnnotation dans la classe et probablement mettre if (ModelState.IsValid) en haut du bloc de sauvegarde / modification. . .
la source
En fait, il existe un moyen d'utiliser deux ou plusieurs modèles sur une vue sans les envelopper dans une classe qui contient les deux.
Utiliser Employee comme exemple de modèle:
Est en fait traité comme.
Ainsi, la méthode View (employé) définit votre modèle sur le ViewBag, puis le ViewEngine le transforme.
Cela signifie que,
Peut être utilisé comme,
Essentiellement, vous pouvez utiliser tout ce qui se trouve dans votre ViewBag comme "modèle", car c'est ainsi que cela fonctionne de toute façon. Je ne dis pas que c'est architecturalement idéal, mais c'est possible.
la source
Créez simplement un modèle de vue unique avec toutes les informations nécessaires, ce que je fais normalement est de créer un modèle pour chaque vue afin que je puisse être spécifique sur chaque vue, que ce soit cela ou créer un modèle parent et en hériter. OU créez un modèle qui inclut les deux vues.
Personnellement, je les ajouterais simplement dans un seul modèle, mais c'est comme ça que je le fais:
la source
Vous pouvez utiliser le modèle de présentation http://martinfowler.com/eaaDev/PresentationModel.html
Ce modèle de présentation "Vue" peut contenir à la fois Person et Order, cette nouvelle
classe peut être le modèle de référence de votre vue.
la source
Une autre façon dont on ne parle jamais est de créer une vue dans MSSQL avec toutes les données que vous souhaitez présenter. Ensuite, utilisez LINQ to SQL ou autre pour le mapper. Dans votre contrôleur, retournez-le à la vue. Terminé.
la source
vous ne pouvez pas déclarer deux modèles sur une vue, essayez d'utiliser
Html.Action("Person", "[YourController]")
&Html.Action("Order", "[YourController]")
.Bonne chance.
la source
En plus d'un modèle de vue dans asp.net, vous pouvez également créer plusieurs vues partielles et affecter une vue de modèle différente à chaque vue, par exemple:
puis un autre modèle de vue partielle pour le modèle de commande
puis dans votre vue principale, chargez les deux vues partielles en
la source
J'espère que vous le trouverez utile !!
J'utilise ViewBag For Project et Model pour la tâche, donc de cette manière j'utilise deux modèles en vue unique et dans le contrôleur, j'ai défini la valeur ou les données de viewbag
et en vue tbltask et projectlist sont mes deux modèles de diff
@ {
} Liste @model
la source