0
votes

I'm still quite new to ASP.NET-MVC so i'm still a bit confused about returns and redirects and DropDownListFor values.

I have a view where a user inserts data to add to a database. Most of the data comes from DropDownLists, where the Lists are stored in the model. The lists are initiated once you enter the page for the first time, filling the model. Once you submit, the HttpPost on the Controller has a "ModelState.IsValid", and returns to the same page with the errors. The problem is, all the lists i had filled are now empty and the DropDownListFor are all empty.

Is there a way to keep the model with its values? Also, is there a way to keep the values previously entered on a DropDownListFor on return?

View Code:

@using Encomendas_WebFinal.Models

@{
    ViewBag.Title = "Encomenda";
}

@model ClientModel

<link rel="stylesheet" href="~/Content/zebra_datepicker.min.css" />
<script src="~/Scripts/zebra_datepicker.min.js"></script>

<h1>Encomenda</h1>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <div class="form-group">


        <h3>Encomenda:</h3>
        <fieldset>
            <p>@Html.DropDownListFor(m => m.SelectedEncomenda.NumEncomenda, Model.ListEncomendas, "")</p>
            @Html.ValidationMessageFor(m => m.SelectedEncomenda.NumEncomenda)
        </fieldset>

        <h3>Data:</h3>
        @Html.EditorFor(m => m.SelectedEncomenda.Data, new { htmlAttributes = new { @class = "calendar"} })


        <h3>Tipo de Infraestrutura:</h3>

       <input type="radio" name="selectedLinhaType" id="150KV"/> 150kV <br>
       <input type="radio" name="selectedLinhaType" id="220KV"/> 220KV <br>
       <input type="radio" name="selectedLinhaType" id="400KV"/> 440KV <br>
       <input type="radio" name="selectedLinhaType" id="Gasodutos" /> Gasodutos <br>
       <input type="radio" name="selectedLinhaType" id="Patrimonios" /> Patrimonios <br>


        <div class ="infobox" id="is150KV">
            <fieldset>
                <h3>Linha 150KV:</h3>
                <p>@Html.DropDownListFor(m => m.SelectedLinha.NumLinha, Model.ListLinha150, new { disabled = "disabled", @id="Linha150KV"})</p>
            </fieldset>
        </div>
        <div class ="infobox" id="is220KV">
            <fieldset>
                <h3>Linha 220KV:</h3>
                <p>@Html.DropDownListFor(m => m.SelectedLinha.NumLinha, Model.ListLinha220, new { disabled = "disabled", @id = "Linha220KV" })</p>
            </fieldset>
        </div>
        <div class="infobox" id="is400KV">
            <fieldset>
                <h3>Linha 400KV:</h3>
                <p>@Html.DropDownListFor(m => m.SelectedLinha.NumLinha, Model.ListLinha400 as List<SelectListItem>, new { disabled = "disabled", @id = "Linha400KV" })</p>
            </fieldset>
        </div>
        <div class="infobox" id="isGasoduto">
            <fieldset>
                <h3>Gasoduto:</h3>
                <p>@Html.DropDownListFor(m => m.SelectedLinha.NumLinha, Model.ListGasodutos, new { disabled = "disabled", @id = "Gasoduto" })</p>
            </fieldset>
        </div>
        <div class="infobox" id="isPatrimonio">
            <h4> Patrimonio Selected</h4>
        </div>
    </div>

    <h3>Concelho:</h3>
    <fieldset>
        <p>@Html.DropDownListFor(m => m.SelectedConcelho, Model.ListConcelhos, "")</p>
    </fieldset>

    <h3>Numero de Tecnicos de Aviso: @Html.TextBoxFor(m => m.SelectedEncomenda.TecnicoAvisoNum, new { type = "number", min = "0", max = "3", step = "1", value = "0", @id="TecnicoAvisoNum" }) </h3>
    <div class="infobox" id="TecnicoAviso1">
        <h4> Tecnico Aviso 1</h4>
    </div>
    <div class="infobox" id="TecnicoAviso2">
        <h4> Tecnico Aviso 2</h4>
    </div>
    <div class="infobox" id="TecnicoAviso3">
        <h4> Tecnico Aviso 3</h4>
    </div>
    <div class="infobox" id="TecnicoAvisoErro">
        <h2> Por favor insira um valor inteiro entre 0 e 3.</h2>
    </div>
    <input type="submit" value="Post" />

    @section Scripts
{

    <script type="text/javascript">
        $(document).ready(function () {
            $('.calendar').Zebra_DatePicker({

                show_week_number: 'Wk',
                format: 'd/m/Y'

                });

            $('#is150KV').hide(); $('#is220KV').hide(); $('#is400KV').hide(); $('#isGasoduto').hide(); $('#isPatrimonio').hide();
            $('#TecnicoAviso1').hide(); $('#TecnicoAviso2').hide(); $('#TecnicoAviso3').hide(); $('#TecnicoAvisoErro').hide();
            $('#150KV').change(function () {
                $('#is220KV').hide(); $('#is400KV').hide(); $('#isGasoduto').hide(); $('#isPatrimonio').hide();
                $('#is150KV').show();
                $('#Linha220KV').attr('disabled', true); $('#Linha400KV').attr('disabled', true); $('#Gasoduto').attr('disabled', true);
                $('#Linha150KV').removeAttr('disabled');
            });

            $('#220KV').change(function () {
                $('#is150KV').hide(); $('#is400KV').hide(); $('#isGasoduto').hide(); $('#isPatrimonio').hide();
                $('#is220KV').show();
                $('#Linha150KV').attr('disabled', true); $('#Linha400KV').attr('disabled', true); $('#Gasoduto').attr('disabled', true);
                $('#Linha220KV').removeAttr('disabled');
            });

            $('#400KV').change(function () {
                $('#is150KV').hide(); $('#is220KV').hide(); $('#isGasoduto').hide(); $('#isPatrimonio').hide();
                $('#is400KV').show();
                $('#Linha150KV').attr('disabled', true); $('#Linha220KV').attr('disabled', true); $('#Gasoduto').attr('disabled', true);
                $('#Linha400KV').removeAttr('disabled');
            });

            $('#Gasodutos').change(function () {
                $('#is150KV').hide(); $('#is220KV').hide(); $('#is400KV').hide(); $('#isPatrimonio').hide();
                $('#isGasoduto').show();
                $('#Linha150KV').attr('disabled', true); $('#Linha220KV').attr('disabled', true); $('#Linha400KV').attr('disabled', true);
                $('#Gasoduto').removeAttr('disabled');
            });

            $('#TecnicoAvisoNum').change(function () {
               if ($('#TecnicoAvisoNum').val() == 0)  {
                $('#TecnicoAviso1').hide(); $('#TecnicoAviso2').hide(); $('#TecnicoAviso3').hide(); $('#TecnicoAvisoErro').hide();
            }
            else
            if ($('#TecnicoAvisoNum').val() == 1) {
                $('#TecnicoAviso1').show(); $('#TecnicoAviso2').hide(); $('#TecnicoAviso3').hide(); $('#TecnicoAvisoErro').hide();
            }
            else
            if ($('#TecnicoAvisoNum').val() == 2) {
                $('#TecnicoAviso1').hide(); $('#TecnicoAviso2').show(); $('#TecnicoAviso3').hide(); $('#TecnicoAvisoErro').hide();
                }
            else
            if ($('#TecnicoAvisoNum').val() == 3) {
                $('#TecnicoAviso1').hide(); $('#TecnicoAviso2').hide(); $('#TecnicoAviso3').show(); $('#TecnicoAvisoErro').hide();
            }
            else
            { 
                $('#TecnicoAviso1').hide(); $('#TecnicoAviso2').hide(); $('#TecnicoAviso3').hide(); $('#TecnicoAvisoErro').show();
            }
            });
        })
    </script>

    }

}

Controller:

using Encomendas_WebFinal.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.UI.WebControls;

namespace Encomendas_WebFinal.Controllers
{
    public class EncomendaController : BaseController
    { 
        ClientModel cliente = new ClientModel();
        ConcelhosModel concelhos = new ConcelhosModel();

        //DB CONNECTION STRING
        private static string GetSQLConnectionString()
        {

            string cstr =
                "Server=localhost;Database=REN_Encomendas;User Id=admin;Password=admin;";
            return cstr;
        }

        //GET DB TABLE
        private static DataSet ExecuteQuery(string query)
        {
            SqlConnection dbConnection;
            SqlCommand dbCommand;
            DataSet objDataSet;
            SqlDataAdapter objAdapter;

            dbConnection = new SqlConnection();
            dbConnection.ConnectionString = GetSQLConnectionString();
            dbConnection.Open();

            objAdapter = new SqlDataAdapter();
            objDataSet = new DataSet();
            dbCommand = new SqlCommand(query);

            dbCommand.Connection = dbConnection;
            objAdapter.SelectCommand = dbCommand;
            objAdapter.Fill(objDataSet);

            dbCommand.Dispose();
            objAdapter.Dispose();
            dbConnection.Dispose();
            dbConnection.Close();

            return objDataSet;

        }


       //GET PostEncomenda
        public ActionResult PostEncomenda()
        {
            //Initiate Data
            cliente.ListaEncomendas = GetEncomendasList();
            concelhos.Nomes = GetConcelhos();
            concelhos.Linhas150 = GetLinhas("150");
            concelhos.Linhas220 = GetLinhas("220");
            concelhos.Linhas400 = GetLinhas("400");
            concelhos.Gasoduto = GetGasodutos();

            //Makes a DropDownList for Encomendas
            List<SelectListItem> ListEncomenda = new List<SelectListItem>();
            for (int i = 0; i< cliente.ListaEncomendas.Count; i++)
            {
                ListEncomenda.Add(new SelectListItem
                {
                    Text = cliente.ListaEncomendas[i].NumEncomenda.ToString() + " -- " + cliente.ListaEncomendas[i].NomeEncomenda,
                    Value = cliente.ListaEncomendas[i].NumEncomenda.ToString() + "-_-_-" + cliente.ListaEncomendas[i].NomeEncomenda,

            });
            }
            //Makes a DropDownList for Linhas
            List<SelectListItem> ListLinhas150 = new List<SelectListItem>();
            for (int i = 0; i< concelhos.Linhas150.Count; i++)
            {
                ListLinhas150.Add(new SelectListItem
                {
                    Text = concelhos.Linhas150[i].NumLinha + " -- " + concelhos.Linhas150[i].NomeLinha,
                    Value = concelhos.Linhas150[i].NumLinha + "-_-_-" + concelhos.Linhas150[i].NomeLinha,

            });
            }
            List<SelectListItem> ListLinhas220 = new List<SelectListItem>();
            for (int i = 0; i < concelhos.Linhas220.Count; i++)
            {
                ListLinhas220.Add(new SelectListItem
                {
                    Text = concelhos.Linhas220[i].NumLinha + " -- " + concelhos.Linhas220[i].NomeLinha,
                    Value = concelhos.Linhas220[i].NumLinha + "-_-_-" + concelhos.Linhas220[i].NomeLinha,

                });
            }
            List<SelectListItem> ListLinhas400 = new List<SelectListItem>();
            for (int i = 0; i < concelhos.Linhas400.Count; i++)
            {
                ListLinhas400.Add(new SelectListItem
                {
                    Text = concelhos.Linhas400[i].NumLinha + " -- " + concelhos.Linhas400[i].NomeLinha,
                    Value = concelhos.Linhas400[i].NumLinha + "-_-_-" + concelhos.Linhas400[i].NomeLinha,

                });
            }
            //Makes a DropDownList for Gasodutos
            List<SelectListItem> ListGasodutos = new List<SelectListItem>();
            for (int i = 0; i < concelhos.Gasoduto.Count; i++)
            {
                ListGasodutos.Add(new SelectListItem
                {
                    Text = concelhos.Gasoduto[i].NumLinha + " -- " + concelhos.Gasoduto[i].NomeLinha,
                    Value = concelhos.Gasoduto[i].NumLinha + "-_-_-" + concelhos.Gasoduto[i].NomeLinha,

                });
            }
            //Makes a DropDownList for Concelhos
            List<SelectListItem> ListConcelhos = new List<SelectListItem>();
            for (int i = 0; i < concelhos.Nomes.Count; i++)
            {
                ListConcelhos.Add(new SelectListItem
                {
                    Text = concelhos.Nomes[i],
                    Value = concelhos.Nomes[i]
                });
            }


            cliente.ListLinha150 = ListLinhas150;
            cliente.ListLinha220 = ListLinhas220;
            cliente.ListLinha400 = ListLinhas400;
            cliente.ListGasodutos = ListGasodutos;
            cliente.ListConcelhos = ListConcelhos;
            cliente.ListEncomendas = ListEncomenda;

            cliente.SelectedEncomenda = new PostEncomendaModel();
            return View(cliente);
        }

        //POST PostEncomenda
        [HttpPost]
        public ActionResult PostEncomenda(ClientModel viewModel)
        {
            if(ModelState.IsValid)
            {
                //Test Stuff
                PostEncomendaModel encomenda = new PostEncomendaModel();
                string[] encomendaNumNome = viewModel.SelectedEncomenda.NumEncomenda.Split(new[] { "-_-_-" }, StringSplitOptions.None);
                encomenda.NumEncomenda = encomendaNumNome[0];
                encomenda.NomeEncomenda = encomendaNumNome[1];

                encomendaNumNome = viewModel.SelectedLinha.NumLinha.Split(new[] { "-_-_-" }, StringSplitOptions.None);
                encomenda.Linha = new Linhas();
                encomenda.Linha.NomeLinha = encomendaNumNome[0];
                encomenda.Linha.NumLinha = encomendaNumNome[1];
                encomenda.Data = viewModel.SelectedEncomenda.Data;

                TempData["Encomenda"] = encomenda;

                return RedirectToAction("Teste", "Encomenda");
            }

            return View(viewModel);
        }

        //GET Submit Test
        [HttpGet]
        public ActionResult Teste(PostEncomendaModel model)
        {
            PostEncomendaModel encomenda = new PostEncomendaModel();
            encomenda = (PostEncomendaModel)TempData["Encomenda"];
            ViewBag.EncomendaNum = encomenda.NumEncomenda;
            ViewBag.EncomendaNome = encomenda.NomeEncomenda;
            ViewBag.LinhaNum = encomenda.Linha.NumLinha;
            ViewBag.LinhaNome = encomenda.Linha.NomeLinha;
            ViewBag.Data = Convert.ToDateTime(encomenda.Data);
            DateTime tempdata = ViewBag.Data;
            DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(tempdata);
            if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
            {
                tempdata = tempdata.AddDays(3);
            }

            ViewBag.Semana = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(tempdata, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
            return View();
        }

        //GET ALL ENCOMENDAS FROM DB FOR THE SELECTED CLIENT LOGGED ON
        public IList<EncomendaModel> GetEncomendasList()
        {
            IList<EncomendaModel> encomendas= new List<EncomendaModel>();

            //GET Encomenda Name && Number
            string username = HttpContext.Request.Cookies.Get("nome").Value;
            string query = "SELECT * FROM dbo.renland_encomenda AS child WHERE child.coordenad LIKE '" + username + "%'"; //Meter User.Identity.GetUserName(); aqui
            DataSet table_encomendas = ExecuteQuery(query);
            foreach (DataRow r in table_encomendas.Tables[0].Rows)
            {
                if (Convert.ToInt32(r[2]) == 1) //Se Encomenda esta ativa
                {
                    EncomendaModel tEnco = new EncomendaModel();
                    string numEnco = r[0].ToString();
                    tEnco.NumEncomenda = r[1].ToString();
                    tEnco.NomeEncomenda = r[3].ToString();
                    encomendas.Add(tEnco);
                }
            }

            query = "SELECT numero, ativa, prest_serv FROM dbo.renland_encomenda_patrimonio AS child WHERE child.coordenad LIKE '"+ username +"%'";
            DataSet table_encomendas2 = ExecuteQuery(query);
            foreach (DataRow r in table_encomendas2.Tables[0].Rows)
            {
                if (Convert.ToInt32(r[1]) == 1) //Se Encomenda esta ativa
                {
                    EncomendaModel tEnco = new EncomendaModel();
                    string numEnco = r[0].ToString();
                    tEnco.NumEncomenda = r[0].ToString();
                    tEnco.NomeEncomenda = r[2].ToString();
                    encomendas.Add(tEnco);
                }
            }
            return encomendas;           
        }

        //GET ALL CONCELHOS 
        public IList<string> GetConcelhos()
        {
            IList<string> concelhos = new List<string>();
            string query = "SELECT Concelho FROM dbo.Concelhos";
            DataSet table = ExecuteQuery(query);
            foreach(DataRow r in table.Tables[0].Rows)
            {
                concelhos.Add(r[0].ToString());
            }
            return concelhos;
        }

        //GET ALL LINHAS
        public IList<Linhas> GetLinhas(string num)
        {
            IList<Linhas> tlinha = new List<Linhas>();
            string query = "SELECT DISTINCT ID_LN FROM dbo.RENLAND_PLANOMANUTENCAOFAIXA AS child WHERE child.N_TENSAO LIKE '"+num+ "%' ORDER BY ID_LN ASC";
            string query2 = "SELECT ID_LN, DESCR_LN FROM dbo.SEGMENTOS_RNT WHERE ID_LN LIKE '%' ORDER BY ID_LN ASC";
            DataSet table = ExecuteQuery(query);
            DataSet table2 = ExecuteQuery(query2);
            foreach (DataRow r in table.Tables[0].Rows)
            {
                Linhas tl = new Linhas();
                tl.NumLinha= r[0].ToString();


                foreach (DataRow r2 in table2.Tables[0].Rows)
                {
                    if (tl.NumLinha== r2[0].ToString())
                    {
                        tl.NomeLinha = r2[1].ToString();
                        break;
                    }
                }
                tlinha.Add(tl);
            }

            return tlinha;
        }

        //GET ALL GASODUTOS
        public IList<Linhas> GetGasodutos()
        {
            IList<Linhas> tlinha = new List<Linhas>();
            string query = "SELECT ID_GD, DEN_GD FROM dbo.Gasodutos_RNTGN ";
            DataSet table = ExecuteQuery(query);
            foreach (DataRow r in table.Tables[0].Rows)
            {
                Linhas tl = new Linhas();
                tl.NumLinha = r[0].ToString();
                tl.NomeLinha = r[1].ToString();
                tlinha.Add(tl);
            }

            return tlinha;
        }

    }
}

Client Model:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Encomendas_WebFinal.Models;
using System.Web.Mvc;

namespace Encomendas_WebFinal.Models
{
    public class ClientModel
    {
        private IList<EncomendaModel> listaEncomendas = new List<EncomendaModel>();
        public IList<EncomendaModel> ListaEncomendas { get { return listaEncomendas; } set { listaEncomendas = value; } }

        public PostEncomendaModel SelectedEncomenda { get; set; }
        public Linhas SelectedLinha { get; set; }
        public string SelectedConcelho { get; set; }


        List<SelectListItem> _listEncomendas = new List<SelectListItem>();
        public List<SelectListItem> ListEncomendas { get { return _listEncomendas; } set { _listEncomendas = value; } }

        List<SelectListItem> _listLinha150 = new List<SelectListItem>();
        public List<SelectListItem> ListLinha150 { get { return _listLinha150; } set { _listLinha150 = value; } }

        List<SelectListItem> _listLinha220 = new List<SelectListItem>();
        public List<SelectListItem> ListLinha220 { get { return _listLinha220; } set { _listLinha220 = value; } }

        List<SelectListItem> _listLinha400 = new List<SelectListItem>();
        public List<SelectListItem> ListLinha400 { get { return _listLinha400; } set { _listLinha400 = value; } }

        List<SelectListItem> _listGasodutos = new List<SelectListItem>();
        public List<SelectListItem> ListGasodutos { get { return _listGasodutos; } set { _listGasodutos = value; } }

        List<SelectListItem> _listPatrimonios = new List<SelectListItem>();
        public List<SelectListItem> ListPatrimonios { get { return _listPatrimonios; } set { _listPatrimonios = value; } }

        List<SelectListItem> _listConcelhos = new List<SelectListItem>();
        public List<SelectListItem> ListConcelhos { get { return _listConcelhos; } set { _listConcelhos = value; } }

    }
}

PostEncomendaModel Model:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

namespace Encomendas_WebFinal.Models
{
    public class PostEncomendaModel
    {
        //Not all data annotations are complete
        [Required]
        [Display(Name = "Encomenda")]
        public string NumEncomenda { get; set; }

        [Display(Name = "Nome da Encomenda")]
        public String NomeEncomenda { get; set; }

        [Required]
        [Display(Name = "Linha")]
        public Linhas Linha { get; set; }

        [Required]
        public string Data { get; set; }
        public int Semana { get; set; }

        [Display(Name = "Vãos")]
        public String Vaos { get; set; }

        private IList<String> _concelho = new List<String>();
        [Display(Name = "Concelho")]
        [Required]
        public IList<String> Concelho { get { return _concelho; } set { _concelho = value; } }


        public int TecnicoAvisoNum { get; set; }
        public int EquipaCampoNum { get; set; }
        private IList<String> _tecnicoAviso = new List<String>(3);
        [Display(Name = "Tecnico de Aviso")]
        public IList<String> TecnicoAviso { get { return _tecnicoAviso; } set { _tecnicoAviso = value; } }

        private IList<String> _equipaCampo = new List<String>(3);
        [Display(Name = "Equipa de Campo")]
        public IList<String> EquipaCampo { get { return _equipaCampo; } set { _equipaCampo = value; } }

        private IList<String> _tecnicoAvisoTel = new List<String>(3);
        [Display(Name = "Telefone Tecnico")]
        public IList<String> TecnicoAvisoTel { get { return _tecnicoAvisoTel; } set { _tecnicoAvisoTel = value; } }

        private IList<String> _equipaCampoTel = new List<String>(3);
        [Display(Name = "Telefone Equipa")]
        public IList<String> EquipaCampoTel { get { return _equipaCampoTel; } set { _equipaCampoTel = value; } }

        [Display(Name = "Email")]
        public String Email { get; set; }

        [Display(Name = "Observações")]
        public String Observacoes { get; set; }
    }

}
1
I can't see a reason why the fields would be blank, but certainly the dropdownlists you will need to re-populate since that won't get returned from the form submission. I'd probably move the code that populates the dropdowns into a separate method that you can call from both the GET and POST actions. - ADyson
I actually did it by creating a seperate method and calling it on GET and POST. Everything is being stored just like i wanted too. The problem is the radio selection didn't get stored. Is there a way to store it? - JoaoRebelo

1 Answers

1
votes

Your radios are like:

<input type="radio" name="selectedLinhaType" id="150KV"/> 150kV <br>

Where the name is selectedLinhaType. This name doesn't match up with any property on your view model, so any posted values will simply be discarded by the model binder. The name must match the name of the property you want the value to bind to. You could manually change the name attribute on these, but the better approach is to let Razor handle it:

@Html.RadioButtonFor(m => m.MyProperty, "foo")

Where MyProperty is the property you want to bind to the posted value to, and "foo" is the value this radio button should have.