11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


senza fare la gestione delle annotazioni,

Insisti, perché usare le annotazioni è il modo corretto di farlo. Grazie alle annotazioni, potrai ripetere la validazione anche lato server e senza dover scrivere altro codice ma solo verificando il valore di ModelState.IsValid. È essenziale farlo perché la validazione client può sempre essere bypassata dall'utente escludendo il javascript o manipolando la richiesta che viene inviata al server.

non mi trovo tutte quelle librerie js

Le puoi ottenere installando questo pacchetto NuGet:
https://www.nuget.org/packages/jQuery.Validation.Unobtrusive/

ciao,
Moreno
Modificato da BrightSoul il 17 marzo 2018 14.43 -

Enjoy learning and just keep making
16 messaggi dal 24 febbraio 2018
Ancora grazie Moreno :)
16 messaggi dal 24 febbraio 2018
Buongiorno Moreno, scusami se ti scoccio ancora,ho un altro problema.
Voglio fare una view che estragga tutti gli acquisti effettuati, ho la classe Acquisti che ha le relazioni 1 a molti con Clienti e Prodotti.
Nel mio controller ho scritto quanto segue:

public ActionResult Index()
{
List<Acquisti> listaAcquisti = new List<Acquisti>();
using (Database1Entities db = new Database1Entities())
{
listaAcquisti = db.Acquisti.ToList();
}
return View(listaAcquisti);
}

però quando vado nella view tipizzata su Acquisti e scrivo il codice seguente:

@model List<AcquistiVendite.Acquisti>
<table>
<tr>
<th>IdAcquisto</th>
<th>Data</th>
<th>Quantita</th>
<th>Prezzo</th>
<th>IDCLIENTE</th>
<th>IDPRODOTTO</th>
</tr>

@foreach (var item in Model)
{
<tr>
<td>@item.IdAcquisto</td>
<td>@item.Data</td>
<td>@item.Quantita</td>
<td>@item.PrezzoperQuantita</td>
<td>@item.Clienti.IdCliente</td> <-------
<td>@item.Prodotti.IdProdotto </td> <-------
</tr>

}


mi da errore alle righe <td>@item.Clienti.IdCliente</td> e <td>@item.Prodotti.IdProdotto </td> dicendo:
System.ObjectDisposedException: 'L'istanza di ObjectContext è stata eliminata e non può più essere utilizzata per operazioni che richiedono una connessione.'
Mi potresti aiutare per favore? Grazie 1000
P.S. per uan tua comodità ti riporto il contenuto della classe Acquisti:
namespace AcquistiVendite
{
using System;
using System.Collections.Generic;

public partial class Acquisti
{
public int IdAcquisto { get; set; }
public int Quantita { get; set; }
public System.DateTime Data { get; set; }
public Nullable<int> PrezzoperQuantita { get; set; }

public virtual Clienti Clienti { get; set; } <----relazione
public virtual Prodotti Prodotti { get; set; } <----relazione
}
}
Modificato da genny101976 il 20 marzo 2018 12.53 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
il problema è qui:
listaAcquisti = db.Acquisti.ToList();

L'errore si verifica perché non stai caricando proattivamente il "Clienti" e il "Prodotti" relazionati agli Acquisti. Quando provi ad accederci dalla view in questo modo:

<td>@item.Clienti.IdCliente</td>
<td>@item.Prodotti.IdProdotto </td>


L'oggetto Clienti e l'oggetto Prodotti proveranno ad ottenere i dati dal database con il meccanismo del lazy loading, dato che tu stai manifestando l'intenzione di voler leggere le loro proprietà (IdCliente e IdProdotto, rispettivamente). Tuttavia, il caricamento fallirà perché ormai l'ObjectContext è stato distrutto, dato che l'action del controller ha ormai terminato la sua esecuzione.

La soluzione consiste nell'usare l'eager loading per indicare a Entity Framework che deve caricare proattivamente anche i dati delle due entità relazionate "Clienti" e "Prodotti". Dunque prova così:
listaAcquisti = db.Acquisti.Include("Clienti").Include("Prodotti").ToList();


ciao,
Moreno

P.S. Un suggerimento: dai nomi singolari alle entità e alle proprietà di navigazione verso singole entità. Quindi la classe "Clienti" e la proprietà "Clienti" diventa "Cliente". Solo se la proprietà di navigazione è una collezione di "Cliente", allora va bene che si chiami "Clienti". A colpo d'occhio sarà più facile capire cosa è una collezione e cosa un oggetto singolo.

Enjoy learning and just keep making
16 messaggi dal 24 febbraio 2018
Grazie ancora Moreno per l'aiuto e per il suggerimento, solo che adesso mi risulta un pò difficile rinominare le classi, non vorrei "distruggere" quanto fatto. :(

ciao
16 messaggi dal 24 febbraio 2018
Buonasera Moreno, sono ancora qui a scocciarti per un'aiuto,
ora mi trovo nella situazione che partendo dai clienti vorrei tirare fuori tutti gli acquisti di ognuno, quindi nel controller ho scritto:

public ActionResult Visualizza()
{
List<Clienti> clienti = new List<Clienti>();
using (Database1Entities db = new Database1Entities())
{
clienti = db.Clienti.Include("Acquisti").ToList();
return View(clienti);
}
}

quindi ho preso spunto dall'include che mi hai suggerito ieri. Nella view, però quando scrivo @item.Acquisti. <---- dall'elenco non mi fa vedere i campi esempio IdAcquisto etc.
cosa sbaglio ?

@model List<AcquistiVendite.Clienti>
<table>
<tr>
<th>IdCliente</th>
<th>Nome Cliente/th>
<th>IdAcquisto</th>
<th>Quantita</th>
<th>Data</th>
<th>Prezzo</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.IdCliente</td>
<td>@item.Nomecliente</td>
<td>@item.Acquisti. </td>

</tr>

}

</table>


Sempre per una tua comodità ti riporto codice della classe Clienti che ha relazione 1 a molti con Acquisti:

namespace AcquistiVendite
{
using System;
using System.Collections.Generic;

public partial class Clienti
{ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage","CA2214:DoNotCallOverridableMethodsInConstructors")]
public Clienti()
{
this.Acquisti = new HashSet<Acquisti>();
}
public int IdCliente { get; set; }
public string Nomecliente { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage","CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Acquisti> Acquisti { get; set; }
}
}

grazie ancora e scusa ancora per il disturbo.
ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, nessun disturbo, figurati!


dall'elenco non mi fa vedere i campi esempio IdAcquisto etc.

IdAcquisto è una proprietà definita nella classe Acquisti. Nel tuo caso, invece, hai a che fare con una collezione di Acquisti. Vedi?
public virtual ICollection<Acquisti> Acquisti { get; set; }


Quindi devi semplicemente ciclare la collezione in modo che tu possa accedere ad ogni singolo oggetto Acquisti contenuto in essa.

@foreach (var item in Model)
{
<tr>
<td>@item.IdCliente</td>
<td>@item.Nomecliente</td>
<td>
  <ul>
  @foreach (var acquisto in item.Acquisti) {
    <li>@acquisto.IdAcquisto</li>
  }
  </ul>
</td>

</tr>

} 


Come vedi ho innestato un altro ciclo foreach all'interno del foreach che già avevi usato per ciclare i clienti.

Sei sicuro che questo sia il risultato voluto? Vedo che stai realizzando una tabella, non è che per caso ti interessa stampare un dato aggregato, tipo l'ammontare totale degli ordini inviati?

ciao,
Moreno

Enjoy learning and just keep making
16 messaggi dal 24 febbraio 2018
Si, hai ragione, vorrei fare in modo che per ogni cliente mi faccia vedere i suoi acquisti eventuali effettuati :)

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.