I have 3 drop down list that I populate it from 3 different models, and then I try to save the choices in one SQL table.
This is the controller where i populate the drop down list and where i try to save the data to database:
public AttivitaController(AppDbContext db)
{
_db = db;
}
//populate first drop down list
private List<Cliente> GetCLienti()
{
var tuttiClienti = _db.tboClienti.ToList();
return tuttiClienti;
}
//populate second drop down list
private List<Tecnico> GetTecnici()
{
var tuttiTecnici = _db.tboTecnici.ToList();
return tuttiTecnici;
}
//populate third drop down list
private List<SottoCliente> GetSottoCLienti()
{
var tuttiSottoClienti = _db.tboSottoClienti.ToList();
return tuttiSottoClienti;
}
public IActionResult CreareAttivita()
{
ViewBag.Tecnici = GetTecnici();
ViewBag.Clienti = GetCLienti();
ViewBag.SottoClienti = GetSottoCLienti();
return View();
}
//This is how I tried to save data into database
[HttpPost]
public async Task<IActionResult> CreareAttivita(Tecnico tecnico, Cliente cliente, SottoCliente sottoCliente)
{
int idTecnico = 0;
int idCLiente = 0;
int idSottoCliente = 0;
if (!string.IsNullOrWhiteSpace(Request.Form["ddlTecnico"]))
idTecnico = Convert.ToInt32(Request.Form["ddlTecnico"]);
if (!string.IsNullOrWhiteSpace(Request.Form["ddlClienti"]))
idCLiente = Convert.ToInt32(Request.Form["ddlClienti"]);
if (!string.IsNullOrWhiteSpace(Request.Form["ddlSottoCliente"]))
idSottoCliente = Convert.ToInt32(Request.Form["ddlSottoCliente"]);
if (ModelState.IsValid)
{
tecnico.Id = idTecnico;
cliente.Id = idCLiente;
sottoCliente.Id = idSottoCliente;
_db.Add(tecnico);
_db.Add(cliente);
_db.Add(sottoCliente);
await _db.SaveChangesAsync();
return RedirectToAction("Index");
}
return View();
}
if (ModelState.IsValid)
is allways false, I can't get why: This is model Attivita :
[Key]
public int Id { get; set; }
[Required(ErrorMessage = "Seleziona un tecnico!")]
public int Id_tecnici { get; set; }
public int Id_clienti { get; set; }
public int Id_sotto_clienti { get; set; }
[Display(Name = "Commessa")]
[Required(ErrorMessage = "Manca la parte della commessa!")]
public string Commessa { get; set; }
[Display(Name = "Descrizione")]
[Required(ErrorMessage = "Inserisci descrizione!")]
public string Descrizione { get; set; }
public string Nota { get; set; }
[Display(Name = "Data inizio")]
[Required(ErrorMessage = "Inserisci data inizio")]
public DateTime Data_inizio { get; set; }
[Display(Name = "Data fine")]
[Required(ErrorMessage = "Inserisci data fine")]
public DateTime Data_fine { get; set; }
This are the drop down list:
<div class="col text-center">
<div class="btn-group">
@*Lista Tecnici*@
<div class="dropdown">
@Html.DropDownList("ddlTecnico", new SelectList(ViewBag.Tecnici, "Id", "Nome"), "Seleziona Tecnico", new { @id = "ddlTecnico", @class = "btn btn-primary dropdown-toggle mr-3" })
</div>
@*Lista Clienti*@
<div class="dropdown">
@Html.DropDownList("ddlClienti", new SelectList(ViewBag.Clienti, "Id", "Nome_azienda"), "Seleziona Azienda", new { @id = "ddlClienti", @class = "btn btn-primary dropdown-toggle mr-3" })
</div>
@*Lista Sotto Clienti*@
<div class="dropdown">
@Html.DropDownList("ddlSottoCliente", new SelectList(ViewBag.SottoClienti, "Id", "Azienda"), "Seleziona Sotto Cliente", new { @id = "ddlSottoCliente", @class = "btn btn-primary dropdown-toggle mr-3" })
</div>
</div>
</div>
When I submit the data it gaves me error:
ArgumentNullException: Value cannot be null. (Parameter 'items') I can't understand why ddlTecnico
is null
Any suggestion how to fix this? Thanks in advance!
Try to use
private List<SelectListItem> GetCLienti()
{
var tuttiClienti = _db.tboClienti.Select(x =>
new SelectListItem
{
Value = x.Id,
Text = a.Nome
}).ToList();
return tuttiClienti;
}
do so with two other methods. After that change in view
<div class="col text-center">
<div class="btn-group">
@*Lista Tecnici*@
<div class="dropdown">
@Html.DropDownList("ddlTecnico", ViewBag.Tecnici, "Seleziona Tecnico", new { @id = "ddlTecnico", @class = "btn btn-primary dropdown-toggle mr-3" })
</div>
@*Lista Clienti*@
<div class="dropdown">
@Html.DropDownList("ddlClienti", ViewBag.Clienti, "Seleziona Azienda", new { @id = "ddlClienti", @class = "btn btn-primary dropdown-toggle mr-3" })
</div>
@*Lista Sotto Clienti*@
<div class="dropdown">
@Html.DropDownList("ddlSottoCliente",ViewBag.SottoClienti, "Seleziona Sotto Cliente", new { @id = "ddlSottoCliente", @class = "btn btn-primary dropdown-toggle mr-3" })
</div>
</div>
</div>
In the end
if (!string.IsNullOrWhiteSpace(Request.Form["ddlTecnico"]))
idTecnico = Convert.ToInt32(Request.Form["ddlTecnico"].ToString());
Reference that can help you https://www.learnrazorpages.com/razor-pages/forms/select-lists
I have reproduced your error,when running return View();
in your post method,it will return CreareAttivita.cshtml.But in the post method,you didn't intialize ViewBag.Tecnici
, ViewBag.Clienti
and ViewBag.SottoClienti
.So you need to add ViewBag.Tecnici = GetTecnici();ViewBag.Clienti = GetCLienti();ViewBag.SottoClienti = GetSottoCLienti();
.
Here is a demo worked:
Controller:
public IActionResult CreareAttivita()
{
List<Tecnici> list = new List<Tecnici> { new Tecnici { Id = "1", Nome = "Tecnici1" }, new Tecnici { Id = "2", Nome = "Tecnici2" }, new Tecnici { Id = "3", Nome = "Tecnici3" }};
ViewBag.Tecnici=list;
return View();
}
[HttpPost]
public async Task<IActionResult> CreareAttivita(Tecnici tecnici) {
List<Tecnici> list = new List<Tecnici> { new Tecnici { Id = "1", Nome = "Tecnici1" }, new Tecnici { Id = "2", Nome = "Tecnici2" }, new Tecnici { Id = "3", Nome = "Tecnici3" } };
ViewBag.Tecnici = list;
return View();
}
View:
<form method="post">
<div class="dropdown">
@Html.DropDownList("ddlTecnico", new SelectList(ViewBag.Tecnici, "Id", "Nome"), "Seleziona Tecnico", new { @id = "ddlTecnico", @class = "btn btn-primary dropdown-toggle mr-3" })
</div>
<input type="submit" value="submit"/>
</form>
Tecnici:
public class Tecnici
{
public string Id { get; set; }
public string Nome { get; set; }
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.