7 messaggi dal 21 gennaio 2017
Salve,
avrei la necessità di popolare la tabella di una relazione molti a molti ma non facendolo con due select list bensì dovrei farlo tenendo come punto fermo un'id e ciclando sull'altro, mi spego meglio con un esempio (che poi è quello reale):

il mio database
CREATE TABLE [Campi] (
        id int IDENTITY(1,1) PRIMARY KEY,
        campo nvarchar(250) DEFAULT NULL,        
        username nvarchar(200) DEFAULT NULL,
        data datetime DEFAULT NULL      
      );
      GO
      INSERT INTO [Campi] (campo, username, data) VALUES
        ('Campo 1', 'pincopalla', '22/06/2017'),
        ('Campo 2', 'pincopalla', '22/06/2017'),
        ('Campo 3', 'pincopalla', '22/06/2017'),
        ('Campo 4', 'pincopalla', '22/06/2017');
      GO

CREATE TABLE [Controlli] (
        id int IDENTITY(1,1) PRIMARY KEY,
        controllo nvarchar(250) DEFAULT NULL,        
        username nvarchar(200) DEFAULT NULL,
        data datetime DEFAULT NULL      
      );
      GO
      INSERT INTO [Controlli] (controllo, username, data) VALUES
        ('Controllo 1', 'pincopalla', '22/06/2017'),
        ('Controllo 2', 'pincopalla', '22/06/2017'),
        ('Controllo 3', 'pincopalla', '22/06/2017'),
        ('Controllo 4', 'pincopalla', '22/06/2017');
      GO

CREATE TABLE [CampiControlli] (
        id int IDENTITY(1,1) PRIMARY KEY,
        campoID int NOT NULL
          CONSTRAINT [FK_CampiControlli_Campi] FOREIGN KEY (campoID) REFERENCES [Campi](id)
            ON UPDATE NO ACTION
            ON DELETE NO ACTION,
      Campo nvarchar(250) NOT NULL,
        controlloID int NOT NULL
          CONSTRAINT [FK_CampiControlli_Controlli] FOREIGN KEY (controlloID ) REFERENCES [Controlli](id)
            ON UPDATE NO ACTION
            ON DELETE NO ACTION,
        controllo nvarchar(250) NOT NULL      
      );
      GO
      INSERT INTO [CampiControlli] (campoID, campo, controlloID, controllo) VALUES
        (1, 'Campo 1', 2, 'Controllo 2'),
        (1, 'Campo 1', 3, 'Controllo 3'),
        (1, 'Campo 1', 4, 'Controllo 4'),
        (2, 'Campo 2', 2, 'Controllo 2'),
      GO


Ho creato un ViewModel per la tabella molti a molti e quindi CampiControlliViewModel ma non riesco ad andare avanti, mi sembra così logico il da fare ma non riesco a farlo...ci riesco soltanto utilizzando due select list, ma in questo modo se ho 10 campi e 10 controlli devo rifare la stessa operazione ipoteticamente 100 volte, invece il mio obiettivo è avere nell'elenco dei controlli, accanto ad ogni controlli un pulsantino che si porta dietro l'id del controllo e che mi rimanda ad una view che tenendo come punto fermo l'id del controllo mi fa vedere l'elenco dei campi presenti con accanto una chackbox che a seconda di se viene spuntata o meno poi mi popola la tabella molti a molti CampiControlli.
Come avrete capito è sviluppato un MVC,
Vi prego illuminatemi, grazie.
Modificato da ictm il 22 giugno 2017 17.34 -
Beh è come hai descritto:
nella tua pagina devi avere un ViewModel di List(o IEnumerable) di Controllo.
La classe Controllo avrà una List<Campi>

Ormai programmano tutti... ma la professionalità appartiene a pochi
7 messaggi dal 21 gennaio 2017
Nel controller ho:

public ActionResult Create(int? id)
        {            
            var campi = db.Campis.Select(campis => new CampisViewModel { campiID = campis.id, campiCampo = campis.campo }).ToList();            
            return View(campi);
        }


In questo modo mi ritrovo una lista campi, e per i controlli? Io alla view dovrei passare anche il controllo a cui faccio riferimento, per capirci qualcosa del genere

Controlli controllo = db.Controllis.Find(id);

dove id è passato come argomento al create, ma come passo anche questa informazione alla View?
Grazie.
7 messaggi dal 21 gennaio 2017
Ho risolto in questo modo, non so se si può fare meglio...comunque:
public ActionResult Create(int? id)
        {            
            var campi = db.Campis.Select(campis => new CampisViewModel { campiID = campis.id, campiCampo = campis.campo }).ToList();            
Controlli controllo = new Controlli();
            controllo = db.Controllis.Find(id);
            ViewBag.controlloID = controllo.id;
            ViewBag.controllo = controllo.controllo; 
            return View(campi);
        }

e poi nella View ciclando in questo modo
@model List<xxx.ViewModels.CampiControlliViewModel>
...
 @for (int i = 0; i < Model.Count; i++)
                {
                @Html.HiddenFor(a => a[i].operatoreGiroCampiID)
                @Html.HiddenFor(a => a[i].operatoreGiroCampiCampo)
                @Html.HiddenFor(a => a[i].operatoreGiroSalaPompeID, (int)ViewBag.operatoreGiroSalaPompeID)
                @Html.HiddenFor(a => a[i].operatoreGiroSalaPompeControllo, (string)ViewBag.operatoreGiroSalaPompeControllo)

                <tr>
                    <td>
                        @Html.Label("campi[" + @i + "].campo", Model[i].campo)
                    </td>
                    <td>
                        @Html.CheckBoxFor(a => a[i].abilitato, new { @class = "big-checkbox" })
                        @Html.ValidationMessageFor(a => a[i].abilitato, "", new { @class = "text-danger" })
                    </td>
                </tr>
            }

Se può essere utile a qualcuno oppure se qualcuno ha qualche suggerimento è bene accetto.
Buona giornata a tutti.
Modificato da ictm il 25 giugno 2017 17.23 -
Scusa ho letto solo ora.
Invece di usare il viewbag, puoi modificare la classe CampisViewModel aggiungendo il Controllo. Nel ViewModel puoi aggiungere tutto quello che ti serve.
Modificato da manuel0081 il 26 giugno 2017 12.58 -

Ormai programmano tutti... ma la professionalità appartiene a pochi

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.