37 messaggi dal 18 aprile 2018
Salve a tutti,
ho un espressione lambda che mi mando nella views con una viewbag, il problema è che quando vado nella view con il debug vedo i dati che mi servono, ma nel foreach mi ferma dicendo che non li trova.. vi scrivo il codice così è più chiaro.
Nel controller:

var tr = db.CP
              .Join(
              db.DTT,
              a=> new {a.IDS,a.IDT},
              b=> new {b.IDS,b.IDT},
              (a,b)=>new {a.DtTr,a.Imp,b.Nome})
              .Where(a=>a.cont.Equals(fid)).ToList();

ViewBag.send = tr;


Preciso che se uso una lambda simile senza join funziona perfettamente

Nella Views:


@foreach (var item in ViewBag.send)
{

@item.DtTr //qui mi ferma dicendomi che non trova DtTr

@item.Imp

@item.Nome

}
                  



se in debug controllo item vedo i dati che mi serve prendere, quindi vedo:
item {DtTr= ecc...}
ma chiaramente non riesco a prenderli

Grazie mille in anticipo
Modificato da Mirko2018 il 05 settembre 2018 13.22 -
11.068 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirko,
dovresti correggere qui:
(a,b)=>new {a.DtTr,a.Imp,b.Nome}


Anziché proiettare un tipo anonimo, usa una classe ben precisa.
(a,b)=>new MiaClasse {DtTr = a.DtTr, Imp = a.Imp, Nome = b.Nome}


Dove MiaClasse è una tua classe creata appositamente per questo scopo. Ad esempio:
public class MiaClasse {
  //Adegua i tipi delle proprietà secondo le tue necessità
  public string DtTr { get; set; }
  public decimal Imp { get; set; }
  public string Nome { get; set; }
}


A questo punto, lato view dovrebbe funzionare. Se non funziona, usa casting espliciti, così aiuti il compilatore a capire con che tipi ha a che fare.
@foreach (MiaClasse item in ViewBag.send as List<MiaClasse>)
{
  @item.DtTr
  @item.Imp
  @item.Nome
}


Il problema era che, usando un tipo anonimo, alla view viene presentato come object che perciò non ha la proprietà DtTr (o qualsiasi altra proprietà). Infatti, credo che il tuo errore fosse "'object' non contiene una definizione per 'DtTr'".

Altre considerazioni:

ciao,
Moreno

Enjoy learning and just keep making
37 messaggi dal 18 aprile 2018
Perfetto grazie, ho utilizzato le tipizzate e funziona perfettamente.
Come sempre gentissimo e disponibile.
37 messaggi dal 18 aprile 2018
Ciao Moreno una domanda.. ho usato il model, ma siccome devo far vedere più liste su una ho usato il model e per l'altra la mando tramite una viewbag, cosndierando che non necessariamente queste liste sono sempre piene ho messo delle condizione per visualizzare la 1 la 2 o tutte e due, ora quello che vorrei fare è un pagining ho trovato guide per farlo con una sola lista utilizzando il model.. per farlo con tutte e due le liste come potre fare? partial view?
11.068 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirco,
puoi semplicemente creare una nuova classe chiamata ad esempio MioViewModel in cui definisci due proprietà: una per ciascuna lista.
public class MioViewModel {
  public List<MiaClasse> ListaMiaClasse { get; set; }
  public List<MiaAltraClasse> ListaMiaAltraClasse { get; set; }
}



Quindi usa MioViewModel come model della view.

ciao,
Moreno

Enjoy learning and just keep making
37 messaggi dal 18 aprile 2018
Ciao Moreno,
sono incappato in un errore.. ovvero ho creto nella cartella Model una classe chiamata ListeViewModel cosi:

public class  CPtr
  {
    //Adegua i tipi delle proprietà secondo le tue necessità
    public DateTime DtTr { get; set; }
    public string valImp { get; set; }
    public string Nome { get; set; }
    public string fdt { get; set; }
    public string Cod { get; set; }
    public DateTime DtIn { get; set; }
    public DateTime DtEnd{ get; set; }
  }

  public class OPtr
  {
    //Adegua i tipi delle proprietà secondo le tue necessità
    public DateTime DtTr { get; set; }
    public string valImporto { get; set; }
    public string Nome { get; set; }
  
  }
  public class ListeModel
  {
    public List<CPtr> CPList { get; set; }
    public List<OPtr> OPList { get; set; }
  }


nel controller questo

ListeViewModel LM = new ListeModel();

LM.CPList = CPtrans;//qui gli mando le liste
LM.OPList = OPtrans;//qui gli mando le liste
return View(LM);


e nella view:

@model IEnumerable<Project.Models.ListeViewModel>

foreach (var item in Model)
{

@item.CPList.Select(x => x.DtTr).SingleOrDefault();




mi sembra un po frozato prendere i dati con la lmabda ma comuqnue mi da errore:


il dizionario richiede un elemento di modello di tipo 'System.Collections.Generic.IEnumerable

come posso risolvere?
Modificato da Mirko2018 il 11 settembre 2018 16.56 -
Modificato da Mirko2018 il 11 settembre 2018 17.09 -
Modificato da Mirko2018 il 11 settembre 2018 17.10 -
11.068 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirko,
mi sembra incorretta la direttiva model.
Il tuo modello non è un elenco di ListeViewModel, ma è un singolo oggetto ListeViewModel.
La tua direttiva model dovrebbe essere così:
@model Project.Models.ListeViewModel


E questo significa che sotto non potrai fare un foreach, dato che il model non è un IEnumerable.

ciao,
Moreno
Modificato da BrightSoul il 11 settembre 2018 17.19 -

Enjoy learning and just keep making
37 messaggi dal 18 aprile 2018
Si ma come faccio un iterazione della lista senza usare il foreach... dentro alla lista che mando ci sono più dati che mi devo riprendere..

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.