9
votes

MVC 4 - Relation et catégories à plusieurs à plusieurs

Je travaille avec ASP.NET MVC 4 et Cadre d'entité. Dans ma base de données, j'ai une table Abonnement qui représente un abonnement aux transports en commun. Cet abonnement peut donner accès à plusieurs sociétés de transports publics (un abonnement pourrait avoir 1, 2, 3, ... entreprises) alors il s'agit d'une relation nombreuses à plusieurs entre ces tables (j'ai une table intermédiaire entre eux).

Je veux permettre la création d'un abonnement à une page qui contiendra un champ montant de l'abonnement et des sociétés disponibles par cases à cocher. Chaque case constitue une société existante (société stockée dans ma base de données).

Une idée de la façon de faire ça? J'ai lu cette cases à cocher multiples ASP.NET MVC mais ce n'était pas vraiment utile.

Edit: Voici mon diagramme de tables.

diagramme de tables


7 commentaires

Les entreprises sont-elles un jeu de données "fixe" (ce qui signifie qu'ils ne seront pas modifiés dans cette vue?)


Exactement. Mes entreprises sont stockées dans ma table «Sociétés» et ne seront pas modifiées ici, dans la vue Créer / Modifier.


Vous pouvez avoir une liste déroulante comme ceci: lien


Non, je ne cherche pas une liste déroulante car comme je l'ai dit, un abonnement pourrait être composé de 2 entreprises ou plus. C'est pourquoi c'est pourquoi je pense que les cases à cocher sont meilleures.


Je ne sais pas quel moteur de vue vous utilisez, mais ce n'est pas si difficile, il vous suffit de faire itérer les entreprises et de créer les boutons. Vous devrez peut-être changer la classe de modèle.


J'utilise le moteur de rasoir. Créer les entreprises n'est pas si difficile oui, mais que diriez-vous de l'action "Créer", par exemple? Comment puis-je vérifier les cases à cocher vérifiées et qui ne sont pas?


Essayer de faire avec ViewModel, mais je ne vois pas comment puis-je l'obtenir.


3 Réponses :


20
votes

Vous commencez avec deux modèles de vue. Le premier qui représente une entreprise sélectionnée ... xxx pré>

... et le second pour l'abonnement à créer: p> xxx pré>

Ensuite, dans le SubscriptionController Code> S Obtenez une action Vous chargez les sociétés de la base de données pour initialiser le modèle de vue: P>

[HttpPost]
public ActionResult Create(SubscriptionCreateViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        var subscription = new Subscription
        {
            Amount = viewModel.Amount,
            SubscriptionByCompanies = new List<SubscriptionByCompany>()
        };

        foreach (var selectedCompany
            in viewModel.Companies.Where(c => c.IsSelected))
        {
            var company = new Company { CompanyId = selectedCompany.CompanyId };
            _context.Companies.Attach(company);

            var subscriptionByCompany = new SubscriptionByCompany
            {
                Company = company
            };

            subscription.SubscriptionByCompanies.Add(subscriptionByCompany);
        }

        _context.Subscriptions.Add(subscription);
        _context.SaveChanges();

        return RedirectToAction("Index");
    }

    return View(viewModel);
}


11 commentaires

Merci beaucoup, je pense que ça va aider! Je vais essayer maintenant et vous le faire savoir. Cependant, une petite question: le rendu de la vue partielle sera effectué automatiquement avec votre échantillon? Merci encore


@Traffy: Oui, Editeur pour (Modèle => Model.canies) Détecte que les sociétés sont une collection et rend une vue partielle par article. Nom du fichier de modèle (doit correspondre au nom du modèle) et les chemins doivent être exacts car MVC recherche la vue partielle avec certaines conventions (les habituelles dans Vues / {contrôlez} et dans partagés etc., mais dans un sous-dossier appelé EditTorTorplates ).


D'accord merci. Là encore, une question: dans la méthode postale, vous créez un nouveau abonnement et peupler le montant et les entreprises. Cependant, il n'y a pas de liste de sociétés ni d'attributs dans ma table. Est-ce qu'il importe si je l'enlève?


Ok, je vois ce que tu veux faire. Laissez-moi 2 secondes pour vous montrer mon modèle de tables.


C'est ici. Pouvez-vous regarder dessus?


Merci. Semble être bon mais une seule chose ne fonctionne pas correctement: quand je vais PublictransportsubsgricBynCompany = nouvelle liste () , vs dit: ne peut pas convertir implicitement convertir le type 'System.Collections. Générique.list 'to' system.data.objects.dataclasses.EntyCollection '


@Traffy: Oh chérie, utilisez-vous cette affaire EF hors datée avec entityObject et aucun pocos? Vous pouvez essayer de commenter cette ligne. Je crois que entityObject initialise automatiquement ses collections de navigation.


Merci ! Ça marche, merci! Une dernière question: comment devrais-je procéder pour une modification s'il vous plaît? Merci encore !


@Traffy: C'est un peu plus de travail. Vous auriez des modèles de vue similaires (mais incluant l'ID dans AbonnementDitViewModel ), chargez l'abonnement, y compris les ID des sociétés déjà liées, chargez à nouveau toutes les sociétés Settent Isselected à vrai pour les entreprises déjà liées à l'abonnement. La post-action est plus difficile car vous devez maintenant supprimer des entités de la table de liens lorsque l'utilisateur dispose d'une entreprise et ajoutez des entités à la table de liens lorsque l'utilisateur a vérifié une nouvelle société. Il suffit de commencer et d'ouvrir de nouvelles questions quand vous serez coincé :)


Merci pour la grande réponse! Mais comme trappant, j'aimerais vraiment voir comment cela s'étend pour éditer et supprimer des fonctionnalités également. Pourriez-vous s'il vous plaît montrer comment vous remplaceriez votre classificationElectViewModel dans votre méthode de contrôleur d'édition pour obtenir les valeurs "cochées" et "non cochées"? C'est la dernière partie du puzzle que je me débats.


@Mattflowers: Quelqu'un a posé la même question dans une nouvelle question. La réponse est ici: Stackoverflow.com/a/17819169/270591



1
votes

Je préfère cette réponse: Enregistrement de nombreuses données sur de nombreuses relations sur MVC Create View Si vous faites d'abord la base de données, passez simplement à la partie de la section 1.


0 commentaires

1
votes

Juste une extension de la réponse de Slauma. Dans mon cas, je devais représenter plusieurs à plusieurs comme une table entre produits et rôles, première colonne représentant des produits, l'en-tête représentant des rôles et la table à remplir avec des cases à cocher pour sélectionner des rôles pour le produit. Pour atteindre cet objectif, j'ai utilisé la fenêtre comme Slauma décrit, mais a ajouté un autre modèle contenant les deux derniers, comme: xxx pré>

suivant, dans le contrôleur, nous devons remplir les données: P>

@model Insurance.Admin.Models.RoleViewModel
@Html.HiddenFor(model => model.Id)
<td>
    @Html.EditorFor(model => model.IsSelected)
</td>


0 commentaires