2015-04-24 3 views
2

J'essaie d'implémenter une application de dictionnaire sur ASP.NET MVC5 avec EF. Ce sont les trois modèles:Comment utiliser trois vues non liées dans ASP.NET MVC 5

mots:

public int WordID { get; set; } 
public int WordNumber { get; set; } 
public string WordText { get; set; } 

Signification:

public int MeaningID { get; set; } 
public int WordNumber { get; set; } 
public int MeaningNumber { get; set; } 
public string MeaningText { get; set; } 

Exemple:

public int ExampleID { get; set; } 
public int WordNumber { get; set; } 
public int MeaningNumber { get; set; } 
public int ExampleNumber { get; set; } 
public string ExampleText { get; set; } 

Il ne devrait pas y avoir de clés étrangères dans ces tableaux. Ce que je veux faire est, quand je trouve un mot, je devrais trouver et afficher toutes les significations liées à ce mot et tous les exemples liés à la signification correcte. Je peux trouver toutes les significations et les exemples connexes. Mais je suis incapable de les afficher sur une vue. J'ai ouvert une vue sur mot, il affiche des mots, mais je ne sais pas comment afficher d'autres données sur cette vue ou toute autre vue. Merci.

+1

Vous pouvez créer un modèle de vue qui contient les trois, puis l'utiliser pour afficher – 3dd

+1

Afficher vos vues. Aussi * "Il ne devrait pas y avoir de clés étrangères dans ces tables" * est un non-sens complet. Il y a * des clés étrangères dans vos structures de données. Sinon, il n'y aurait pas de moyen d'associer des significations avec des mots et des exemples. 'WordNumber',' MeaningNumber' et 'ExampleNumber' sentent exactement comme des clés étrangères. –

+0

@ 3dd Je pensais à ce sujet. Mais comment dois-je gérer la relation entre le sens et l'exemple dans ces viewmodels? – jason

Répondre

3

Vous pouvez créer un ViewModel pour Word classe comme ci-dessous:

public class WordViewModel 
{ 
    public Word Word { get; set; } 

    public IEnumerable<Meaning> WordMeanings { get; set; } 
    public IEnumerable<Example> WordExamples { get; set; } 
} 

Avec l'entrée d'utilisateur pour mot, dans votre méthode d'action du contrôleur, vous pouvez charger les données dans viewModel et renvoyer l'objet viewModel à la vue.

Vous pouvez concevoir votre vue comme vous le souhaitez (charger toutes les données à la fois, charger les données à la demande, etc.). Mais l'approche resterait identique, c'est-à-dire charger les données liées au mot dans un objet viewModel.

+1

+1. En suivant également cette méthode, vous pouvez passer les modèles WordMeaning et WordExamples dans leurs propres vues partielles respectives. –

+0

Merci beaucoup. Une question: Est-il complètement sûr d'utiliser la liste au lieu de IENumerable ? – jason

+0

@jason - "Complètement sûr", eh bien oui ..... Mais comme vous n'êtes pas censé apporter des modifications lorsque vous transmettez des données de collection à afficher, IEnumerable est bien adapté. Il existe d'autres différences lorsque vous utilisez List vs IEnumerable. – SBirthare

1

En supposant que vous essayez de prendre trois classes à la vue. vous avez beaucoup d'options pour atteindre votre objectif.

Vous pouvez utiliser la classe tuple pour concaténer les trois classes en vue.

Word objWord = new Word(); //Your object; 

Meaning objMeaning = new Meaning(); 

Example objExample = new Example(); 

var tupleModel = new Tuple<Word, Meaning, Example>(objWord, objMeaning, objExample); 
return View(tupleModel); 

À votre avis, vous devez ajouter ci-dessous la ligne au-dessus

@model Tuple<Word, Meaning, Example>