MVC 4 - plusieurs-à-Plusieurs de relation et de cases à cocher
Je travaille avec ASP.NET MVC 4 et Entity Framework. Dans ma base de données, j'ai une table Abonnement qui représente un abonnement aux transports publics. Cet abonnement peut fournir un accès à plusieurs entreprises de transport public (donc un abonnement peut avoir 1, 2, 3, ... les entreprises), puis il est Plusieurs-à-Plusieurs relations entre ces tables (j'ai une table intermédiaire entre eux).
Je veux permettre la création d'un abonnement via une page qui contient un champ Montant de l'abonnement et la disposition des entreprises par des cases à cocher. Chaque case représente une société existante (une entreprise stockées dans ma base de données).
Aucune idée de comment faire cela? J'ai lu ce ASP.NET MVC Plusieurs Cases à cocher mais ce n'était pas vraiment utile.
EDIT : Voici mes tables diagramme.
Exactement. Mon sociétés sont stockés dans ma table "entreprises" et ne sera pas modifié ici, dans le créer/modifier la vue.
Vous pouvez avoir un dropdownlist comme ceci: lien
Non, je ne suis pas à la recherche d'un dropdownlist parce que comme je l'ai dit, un abonnement peut être composé de 2 ou plusieurs entreprises. C'est pourquoi je pense que les cases sont mieux.
Je ne connais pas le moteur d'affichage que vous utilisez, mais il n'est pas difficile, vous avez juste besoin de répéter les entreprises et à créer des boutons. Vous pourriez avoir besoin de changer la classe du modèle.
OriginalL'auteur Traffy | 2013-05-05
Vous devez vous connecter pour publier un commentaire.
Vous commencez avec deux modèles de vue. Le premier, ce qui représente une société choisie...
...et la seconde pour l'abonnement à créer:
Puis dans le
SubscriptionController
s OBTENIR une action de charger les entreprises de la base de données à initialiser le modèle de vue:Maintenant, vous avez une vue fortement typée pour cette action:
À obtenir de la société des cases à cocher au bon rendu d'introduire un éditeur de modèle. Il doit avoir le nom
CompanySelectViewModel.cshtml
et va dans le dossierViews/Subscription/EditorTemplates
(créer un dossier manuellement s'il n'existe pas). Il est fortement typé vue partielle:Name
est ajouté en tant que champ caché pour préserver le nom lors d'un POST.Vous avez évidemment le style le point de vue un peu plus.
Maintenant, votre POST action pourrait ressembler à ceci:
Au lieu d'utiliser
Attach
vous pouvez également charger la société pour la première fois avecvar company = _context.Companies.Find(selectedCompany.CompanyId);
. Mais avecAttach
vous n'avez pas besoin d'un aller-retour à la base de données pour charger les entreprises à être ajoutés à la collection.(Edit 2: Dans cette réponse est une continuation de la
Edit
les actions et les points de vue avec le même exemple de modèle.)Modifier
Votre modèle n'est pas vraiment un plusieurs-à-plusieurs relations. Vous avez deux un-à-plusieurs relations à la place. Le
PublicTransportSubscriptionByCompany
entité n'est pas nécessaire normalement. Si vous avez une clé primaire composite dans la table fait deId_PublicTransportSubscription, Id_PublicTransportCompany
et de supprimer la colonne idId_PublicTransportSubscriptionByCompanyId
EF permettrait de détecter ce schéma de la table plusieurs-à-plusieurs relations et de créer une collection dans chacune des entités pour l'abonnement et de l'entreprise et il ne crée pas de l'entité pour le lien de la table. Mon code ci-dessus s'appliquent alors.Si vous ne voulez pas modifier le schéma pour une raison quelconque, vous devez modifier le POST d'action comme:
Oui,
EditorFor(model => model.Companies)
détecte queCompanies
est une collection et rend une vue partielle par article. Nom du fichier modèle (doit correspondre au nom du modèle) et les chemins d'accès doivent être exacte, car MVC recherches pour la vue partielle avec certaines conventions (les plus habituelles dansViews/{ControllerName}
et dansShared
etc., mais dans un sous-dossier appeléEditorTemplates
).Ok merci. Là encore, une question : dans la méthode post, vous créez un nouvel abonnement et de renseigner le montant et les entreprises. Cependant, il n'existe pas de liste de sociétés ou attribut dans ma table. Est-ce grave si je le supprimer?
Ok, je vois ce que vous voulez faire. Laissez-moi 2 secondes pour vous montrer mes tables de modèle.
C'est un peu plus de travail. Vous l'auriez vue similaire modèles (mais y compris l'Id dans
SubscriptionEditViewModel
), la charge de l'abonnement, y compris l'id de la déjà entreprises liées, charge tous les entreprises, mais ensuite mis enIsSelected
àtrue
pour les entreprises qui sont déjà liés à l'abonnement. POST action est plus difficile parce que maintenant vous avez besoin de supprimer des entités à partir de la table de lien lorsque l'utilisateur a décoché une entreprise et d'y ajouter des entités de la table de lien lorsque l'utilisateur a coché une nouvelle société. Juste de lancer et d'ouvrir de nouvelles questions lorsque vous êtes coincé 🙂OriginalL'auteur Slauma
Je préfère cette réponse: L'enregistrement de Nombreuses de Nombreuses données de relation sur MVC vue de Créer
Si vous faites de la première base de données, puis il suffit de passer à la viewmodel partie de la section 1.
OriginalL'auteur Sam
Juste une extension de Slauma de réponse. Dans mon cas, j'ai eu à représenter plusieurs-à-plusieurs comme une table entre les Produits et les Rôles, la première colonne représente les Produits, l'en-tête représentant les Rôles et le tableau à remplir avec des cases à cocher pour sélectionner les rôles pour le produit.
Pour réaliser cela, j'ai utilisé ViewModel comme Slauma décrit, mais il a ajouté un autre modèle contenant les deux dernières, comme suit:
Prochain, dans le Contrôleur, nous avons besoin de remplir de données:
Prochain, en Vue:
Comme vous le voyez, EditorFor est à l'aide de modèle pour les Produits:
Ce modèle utilise un autre modèle pour les Rôles de:
Et voila, nous avons un tableau contenant première colonne des Produits, l'en-tête contient des Rôles et le tableau est rempli avec des cases à cocher. Nous publions UserViewModel et vous verrez que toutes les données sont affichées.
OriginalL'auteur Nicolae