16 messaggi dal 24 febbraio 2018
Ciao a tutti,
come da oggetto mi occorre creare un combobox mettendo all'interno una lista di clienti:

ho creato una classe StoreIndexViewModel
public class StoreIndexViewModel
{
public IEnumerable<Clienti> PortafoglioClienti { get; set; }
public Acquisti Acquisti { get; set; }
}

**************************************************************************************

Nel controller la action istanzia l'oggetto di classe StoreIndexViewModel
ed in PortafoglioClienti eseguo la lettura del contenuto dalla tabella clienti e passo il model alla
pagina cshtml
public ActionResult Acquista2(int? IdProdotto)
{

using (Database1Entities db = new Database1Entities())
{
StoreIndexViewModel model = new StoreIndexViewModel();

model.Acquisti = new Acquisti();
model.Acquisti.Prodotti = prodotto;
model.PortafoglioClienti = db.Clienti.ToList();

return View(model);

}
}

**************************************************************************************

Nella pagina cshtml cerco di creare la combobox ma non compare il contenuto, mi ritrovo una combo vuota.
Dove sbaglio?
Grazie in anticipo
P.S. ho cercato nel forum ma non trovo nulla di simile :(

<div class="col-md-10">
@{
List<SelectListItem> listItems = new List<SelectListItem>();

listItems.Add(new SelectListItem
{

Value = Model.PortafoglioClienti.ToString()
});

@Html.DropDownList("Portafoglioclienti1", listItems as IEnumerable<Clienti>)

}
</div>
Modificato da genny101976 il 27 febbraio 2018 13.21 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao e benvenuto nel forum!

Credo che il problema sia nel modo in cui componi la lista degli elementi.
<div class="col-md-10">
@{
List<SelectListItem> listItems = new List<SelectListItem>();

listItems.Add(new SelectListItem
{

Value = Model.PortafoglioClienti.ToString()
});

@Html.DropDownList("Portafoglioclienti1", listItems as IEnumerable<Clienti>)

}
</div>

Stai creando un listItems contenente un solo elemento, mentre tu hai bisogno che l'elenco contenga tutti i clienti del portafoglio.

Allora, partiamo dall'inizio: hai creato correttamente un ViewModel chiamato StoreIndexViewModel. All'interno hai definito una proprietà IEnumerable<Clienti> PortafoglioClienti che modificherei così, in modo che sia del tipo giusto per essere usato da una DropDownList.
public class StoreIndexViewModel
{
public SelectList PortafoglioClienti { get; set; }
public Acquisti Acquisti { get; set; }
}


Adesso, torna nell'action Acquista2 e valorizza così la proprietà PortafoglioClienti del viewmodel.
model.PortafoglioClienti = new SelectList(
items: db.Clienti.ToList(),
dataValueField: nameof(Clienti.Id),
dataTextField: nameof(Clienti.RagioneSociale));


La classe SelectList è in pratica un wrapper attorno ai tuoi clienti e ti permette di decidere da quale proprietà leggere il valore e da quale l'etichetta. Tipicamente, si usa l'Id del cliente come valore e la ragione sociale per l'etichetta, ma tu puoi scegliere le proprietà che desideri tra quelle che hai definito nella classe Clienti.
Inoltre, c'è un costruttore della classe SelectList che ti permette di indicare anche qual è il valore preselezionato, nel caso ti servisse impostarlo.

Ora andiamo al modificare la view in questo modo (si semplifica parecchio):
<div class="col-md-10">
@Html.DropDownList("Portafoglioclienti1", Model.PortafoglioClienti)
</div>



ciao,
Moreno

Enjoy learning and just keep making
16 messaggi dal 24 febbraio 2018
Grazie per l'aiuto Moreno, la tua soluzione è andata benissimo, posso chiederti un'ulteriore aiuto?
Come faccio a controllare a passare alla action il valore selezionato dalla combobox ?
grazie in anticipo :)
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, predisponi un'altra action che si chiama allo stesso modo di quella che hai già, ma decorala con l'attributo HttpPost, in modo che riceva i dati del form. Fai in modo che accetti un parametro di tipo AggiornamentoClientiViewModel, in cui il model binder di ASP.NET MVC riverserà i dati passati dal form.

Ricapitolando, crea una nuova action decorata con [HttpPost]
[HttpPost]
public ActionResult NomeTuaAction(AggiornamentoClientiViewModel viewModel)
{
  var valoreSelezionato = viewModel.Portafoglioclienti1;
  //Qui fai qualcosa con valoreSelezionato

  return RedirectToAction(nameof(Index));
}


E poi crea questo nuovo viewModel in cui metti la proprietà Portafoglioclienti1, cioè lo stesso nome che hai dato alla dropdownlist. ASP.NET MVC è in grado di fare il confronto tra i nomi delle chiavi che vengono passate dal form e i nomi delle proprietà del viewModel. Questa operazione si chiama "model binding".

Il ViewModel puoi chiamarlo come vuoi. L'importante è che le sue proprietà abbiano nomi identici a quelli dei campi che hai messo nella view.
public class AggiornamentoClientiViewModel
{
  public string Portafoglioclienti1 { get; set; }
}


Puoi sfruttare questo meccanismo anche per oggetti più complessi. Basta solo capire come nominare i campi lato view.
http://forum.aspitalia.com/forum/post/403972/Inserire-Lista-Proprieta-Model-Interno-Form.aspx

ciao,
Moreno

Enjoy learning and just keep making
16 messaggi dal 24 febbraio 2018
Ciao Moreno, e ancora grazie per il supporto, quindi mi pare di capire che , in pratica una volta che dalla combo seleziono un cliente automaticamente va a finire nel model che io passo alla action per il POST, pertanto mi basta fare model.variabile (che corrisponde in pratica alla mia dropdownlist), grande, pensavo di dover testare poi successivamente quale cliente avevo selezionato etc. ............. SEI IMMENSO MORENO.........faccio subito un pò di prove, e consulto anche l'altro link che mi hai postato. ciao
16 messaggi dal 24 febbraio 2018
Avendo una view.cshtml, con dentro dei campi di input ed una DropDownListFor, posso far fare i controlli che siano stati valorizzati i campi di input e che sia stato selezionata una riga nella drop con javascript? se si, come faccio ad usare javascript? Devo configurare anche qualcosa prima? Grazie in anticipo per il supporto. ciao
11.886 messaggi dal 09 febbraio 2002
Contributi
Heilà!


posso far fare i controlli che siano stati valorizzati i campi di input e che sia stato selezionata una riga nella drop con javascript?


Sì, certamente, con ASP.NET MVC puoi sfruttare la validazione client-side per informare l'utente che i suoi input non sono conformi (es. non ha selezionato una voce). Trovi varie guide cercando "ASP.NET MVC client-side validation", te ne linko alcune.

1. La documentazione, che tratta la validazione lato client verso metà pagina ma è importante seguire tutte le indicazioni che trovi qui.
https://docs.microsoft.com/it-it/aspnet/core/mvc/models/validation

2. Qui c'è un video:
https://www.youtube.com/watch?v=PLe7WbsuHPU

3. Qui un articolo:
https://www.codeproject.com/Articles/718004/ASP-NET-MVC-Client-Side-Validation

ciao,
Moreno

Enjoy learning and just keep making
16 messaggi dal 24 febbraio 2018
Ciao Moreno,
innanzitutto grazie sempre per la tua disponibilità, però stavolta non ho capito granchè(colpa mia), ho visto anche il video, però io non mi trovo tutte quelle librerie js, e non ho nemmeno le seguenti:
<script src="~/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script>


forse mi manca qualcosa?

Inoltre ho modificato il mio web.config nel seguente modo, però comunque non ritrovandomi le js di cui sopra, penso che le righe sottostanti non verranno prese in considerazione..... vero?

<appSettings>
<add key="webpages:Enabled" value="false" />
<add key = "ClientValidationEnabled" value = "true" />
<add key = "UnobtrusiveJavaScriptEnabled" value = "true" />
</appSettings>



Ho la seguente pagina cshtml, e qui vorrei fare in modo che l'utente digiti un mnumero nel campo Quantita, ed il tutto venisse controllato con javascript, senza fare la gestione delle annotazioni, potresti aiutarmi cortesemente ?
grazie sempre

@using (Html.BeginForm("DettaglioPerAcquisto", "Prodotti", FormMethod.Post))
{
<table>
<tr>
<th>IdProdotto</th>
<td>@Model.Acquisti.Prodotti.IdProdotto</td>
@Html.HiddenFor(m => m.Acquisti.Prodotti.IdProdotto)
</tr>
<tr>
<th>NomeProdotto</th>
<td>@Model.Acquisti.Prodotti.NomeProdotto</td>
</tr>
@*L'utente deve digitare la quantità*@
<tr>
<th>@Html.LabelFor(m => m.Acquisti.Quantita)</th>
<td>@Html.EditorFor(m => m.Acquisti.Quantita)</td>
</tr>
</table>
<input type="submit" value="Acquista" />
}

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.