MVC 5 Plusieurs Modèles dans une Seule Vue
Quelqu'un pourrait donner un exemple de la façon de combiner les deux modèles dans un délai d'un point de vue?
Actuellement, j'ai une page appelée RecordCard qui contient:
@model IEnumerable<WebApplication1.Models.Weight>
Cela est prévu par le code suivant dans la AccountController:
public ActionResult RecordCard()
{
var UserId = User.Identity.GetUserId();
var weightModel = from m in db.Weights where m.UserId == UserId select m;
return View(weightModel);
}
La RecordCard page contient également un formulaire qui est lié à la classe suivante:
public class AddWeightModel
{
[Required]
[DataType(DataType.Text)]
[Display(Name = "Stone")]
public Nullable<short> Stone { get; set; }
[Required]
[DataType(DataType.Text)]
[Display(Name = "Pound")]
public Nullable<short> Pound { get; set; }
}
Cependant, ces deux modèles individuels avec des buts différents, alors comment puis-je combiner à un modèle unique qui contient un IEnumerable liste et un ensemble d'éléments de formulaire qui finira par l'envoyer à la AccountController correctement pour ajouter un enregistrement à la base de données en utilisant le code suivant:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RecordCard(Weight Model)
{
if (ModelState.IsValid)
{
using (WebApplication1Entities db = new WebApplication1Entities())
{
Weight weight = new Weight();
weight.UserId = User.Identity.GetUserId();
weight.Stone = Model.Stone;
weight.Pound = Model.Pound;
weight.Date = System.DateTime.Now;
db.Weights.Add(Model);
db.SaveChanges();
}
}
return View(Model);
}
J'ai inclus dans la catégorie de Poids ci-dessous:
public partial class Weight
{
public int Id { get; set; }
public string UserId { get; set; }
public Nullable<short> Stone { get; set; }
public Nullable<short> Pound { get; set; }
public Nullable<System.DateTime> Date { get; set; }
}
Est également ici la WebApplication1Entities classe qui déclare le tableau des Poids aussi Poids:
public partial class WebApplication1Entities : DbContext
{
public WebApplication1Entities()
: base("name=WebApplication1Entities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<Weight> Weights { get; set; }
}
Veuillez expliquer ce qui doit être modifié et comment, peu importe ce que j'essaie de lire, de suivre et de mettre en œuvre, j'ai l'impression de manquer quelque chose.
Toute aide serait grandement appréciée 🙂
OriginalL'auteur iggyweb | 2014-05-08
Vous devez vous connecter pour publier un commentaire.
Je dirais que c'est un bon exemple de l'utilisation de
ViewModel
ici. Je dirais quelque chose comme -Créer
ViewModel
avec la composition des deux classesPuis changer votre point de vue à accepter le point de vue des modèles -
Enfin modifier votre contrôleur pour faire face au changement -
Ce n'est pas une nouvelle classe, ils sont de toutes les classes que vous avez mentionné, afin de les modifier selon votre besoin, je vous ai montré comment vous pouvez passer plusieurs modèles et de les lier. Donc, ils ne sont que des exemples. J'ai édité la réponse.
Ok, pense que la pièce de un cent est en train de disparaître, veuillez excuser mon ignorance, je suis le savait à présent. J'ai des rouges souligne avec la ligne
Weight = weightModel,
et est la Liste de déclarer les champs de formulaire et IEnumerable pour la liste des dossiers?Aussi suis-je la corriger en utilisant
@Html.TextBoxFor(AddWeightModel => AddWeightModel.Weight.Pound, new { @placeholder = "Pound *", @type = "text" })
pour les éléments de formulaire, ne pas avoir toute rouge undlerlines pour que, ouf.J'ai compris pourquoi la ligne rouge a été pour la ligne
Weight = weightModel
sa parce qu'il attendait et IEnumerable j'ai donc modifié le WeightViewModels commepublic IList<AddWeightModel> AddWeightModel { get; set; } public IEnumerable<Weight> ListWeight { get; set; } public Weight Weight { get; set; }
Il n'y a plus de lignes rouges dans mon code et si le projet est compilé, mais je suis maintenant l'obtention de l'erreurThe model item passed into the dictionary is of type 'WebApplication1.Models.Weight', but this dictionary requires a model item of type 'WebApplication1.Models.WeightViewModel
.OriginalL'auteur brainless coder
J'ai abordé ce problème avant, peut est venu à un élégant solution.
D'abord, vous voulez faire l'installation des principales classes d'envoyer, ainsi que d'un 'titulaire' classe pour les stocker pour finalement envoyer à un
view
.Comme vous l'avez probablement constaté, c'est parce qu'un
view
ne pouvez pas avoir plusieurs modèles ont été envoyés.Ce qui vous permettra d'envoyer un nombre de classes à votre page.
Puis, dans votre contrôleur, vous voulez remplir ces classes. Assurez-vous d'initialiser tous d'abord, puis l'ensemble de la population des classes à votre titulaire de la classe.
À votre avis, vous feriez appel de la façon que vous voulez. Mais assurez-vous d'utiliser
HolderModel.SpecifiedModel
dans tous les cas.OriginalL'auteur TheGeekZn
J'ai fait un composé modèle comme ceci:
Dans la vue d'en-tête:
Et obtenir l'accès aux données à partir de la SearchModel, par exemple:
et d'accès aux données à partir de la ResultModel, par exemple:
Merci, c'était mal, je l'ai changé
OriginalL'auteur Uwe Köhler