简体   繁体   中英

Save data from different models into one table SQL Server

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:

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; }
    }

Result: 在此处输入图像描述

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM