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