7 messaggi dal 21 gennaio 2017
Salve,
ho un problema e vorrei un aiuto a risolverlo. Ho le seguenti tabelle nel database

CREATE TABLE [Estintori] (
estintoreID int IDENTITY(1,1) PRIMARY KEY,
numero int UNIQUE NOT NULL,
tipo nvarchar(5),
matricola int UNIQUE NOT NULL,
ubicazione nvarchar(150) NOT NULL,
car bit DEFAULT NULL,
kg int DEFAULT NULL,
scadenzaRevisione int DEFAULT NULL, /* indicare anno di scadenzaRevisione */
scadenzaCollaudo int DEFAULT NULL, /* indicare anno di scadenzaCollaudo */
note nvarchar(2000) DEFAULT NULL,
data datetime NOT NULL,
username nvarchar(50) NOT NULL
);
GO

CREATE TABLE [ControlliEstintori] (
controlloEstintoreID int IDENTITY(1,1) PRIMARY KEY,
esito nvarchar(3) NOT NULL,
note ntext DEFAULT NULL,
username nvarchar(200) NOT NULL,
data datetime NOT NULL,
turno nvarchar(50)  NOT NULL,
estintoreID int NOT NULL
CONSTRAINT [FK_ControlliEstintori_Estintori] FOREIGN KEY (estintoreID) REFERENCES [Estintori](estintoreID)
ON UPDATE NO ACTION
ON DELETE NO ACTION
);
GO


Nel mio progetto MVC con entity framework ho la pagina create.cshtml (per quanto riguarda la tabella [ControlliEstintori]) in cui ho una dropdownlist da cui scelgo l'estintore e compilo i campi relativi. La mia necessità sarebbe quella di avere l'elenco di tutti gli estintori (prendendoli dalla tabella [Estintori]) e di compilare i campi relativi alla tabella [ControlliEstintori], in poche parole anzichè scegliere l'estintore uno per volta da una select vorrei avere una tabella con tutti gli estintori nella prima colonna e nelle successive colonne i campi esito e note. E' possibile realizzare una cosa del genere? Come posso fare?

Questo il codice del relativo controller generato da EF

Grazie in anticipo a tutti.
[Authorize(Roles = "Admin")]
        public ActionResult Create()
        {
            ViewBag.estintoreID = new SelectList(db.Estintoris, "estintoreID", "matricola");
            return View();
        }

        
        [Authorize(Roles = "Admin")]
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "controlloEstintoreID,esito,note,username,data,turno,estintoreID")] ControlliEstintori controlliEstintori)
        {
            if (ModelState.IsValid)
            {
                db.ControlliEstintoris.Add(controlliEstintori);
                db.SaveChanges();

                Helper help = new Helper();
                LogLetturesController logLettura = new LogLetturesController();
                Estintori est = new Estintori();
                est = db.Estintoris.Find(controlliEstintori.estintoreID);
                logLettura.Insert(User.Identity.Name, "Controllo estintore " + est.matricola.ToString() +".", Session["turno"].ToString(), help.GetIPAddress());

                return RedirectToAction("Index");
            }

            ViewBag.estintoreID = new SelectList(db.Estintoris, "estintoreID", "matricola", controlliEstintori.estintoreID);
            return View(controlliEstintori);
        }


E questo il model delle due entità
 public partial class Estintori
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Estintori()
        {
            this.ControlliEstintoris = new HashSet<ControlliEstintori>();
        }
    
        public int estintoreID { get; set; }
        public int numero { get; set; }
        public string tipo { get; set; }
        public int matricola { get; set; }
        public string ubicazione { get; set; }
        public Nullable<bool> car { get; set; }
        public Nullable<int> kg { get; set; }
        public Nullable<int> scadenzaRevisione { get; set; }
        public Nullable<int> scadenzaCollaudo { get; set; }
        public string note { get; set; }
        public System.DateTime data { get; set; }
        public string username { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<ControlliEstintori> ControlliEstintoris { get; set; }
    }



  public partial class ControlliEstintori
    {
        public int controlloEstintoreID { get; set; }
        public string esito { get; set; }
        public string note { get; set; }
        public string username { get; set; }
        public System.DateTime data { get; set; }
        public string turno { get; set; }
        public int estintoreID { get; set; }
    
        public virtual Estintori Estintori { get; set; }
    }


Grazie a tutti.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non è necessario usare le tue classi di entità così come sono. Puoi crearti una nuova classe, che chiamerai ad esempio ControlloEstintoreViewModel e che conterrà solo le proprietà che vuoi mostrare nella view.

Più o meno sarà così, ci metto dentro le proprietà che hai messo tu nel tuo attributo Bind.
public class ControlloEstintoreViewModel {
  //Perché se si tratta di un "create" metti controlloEstintoreId?
  public int controlloEstintoreID {get;set;}
  public string esito {get;set;}
  public string note {get;set;}
  public string username {get;set;}
  public DateTime data {get;set;}
  public string turno {get;set;}
  public int estintoreID {get;set;}
}


Con Entity Framework, fai una query LINQ e proietta oggetti di questo tipo. Il risultato passalo alla view. Io non ho ben capito come dovrebbe essere impostata la tua query, quindi questa che ti riporto qui sotto sarà sicuramente sbagliata. Cerca giusto di carpire il mio intento.
[Authorize(Roles = "Admin")]
public ActionResult Create()
{
  var estintori = db.Estintoris.Select(estintore => new ControlloEstintoreViewModel { username = estintore.username, note = estintore.note, .... }).ToList();
  return View(estintori);
}        

Quindi, la tua view sarà tipizzata su IEnumerable<ControlloEstintoreViewModel>, dato che stiamo appunto passando una lista di quel tipo.

Ora prosegui seguendo questo articolo che ti mostra come modificare liste di oggetti.
http://www.c-sharpcorner.com/UploadFile/4b0136/editing-multiple-records-using-model-binding-in-mvc/

Come vedi, l'action che riceverà i dati del post accetta come argomento la lista del tipo che stavi modificando. Nel tuo caso sarà:
[Authorize(Roles = "Admin")]
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(List<ControlloEstintoreViewModel> controlliEstintori)
{
  //Qui cicla controlliEstintori
  //Per ciascuno, ricrea le tue entità e reinseriscile con entity framework
}


ciao,
Moreno

Enjoy learning and just keep making
7 messaggi dal 21 gennaio 2017
Ciao Moreno, sei stato molto gentile e ti ringrazio infinitamente.
Buona giornata.

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.