我还是ASP.NET-MVC的新手,所以我仍然对返回和重定向以及DropDownListFor值感到困惑。
我有一个用户插入数据以添加到数据库的视图。大多数数据来自DropDownLists,其中列表存储在模型中。首次进入页面后,列表将启动,填充模型。提交后,Controller上的HttpPost具有“ModelState.IsValid”,并返回带有错误的同一页面。问题是,我填写的所有列表现在都是空的,而DropDownListFor都是空的。
有没有办法让模型保持其价值?另外,有没有办法在返回时保留先前在DropDownListFor上输入的值?
查看代码:
@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>
}
}
控制器:
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;
}
}
}
客户端型号:
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模型:
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; }
}
}
答案 0 :(得分:1)
您的收音机就像:
<input type="radio" name="selectedLinhaType" id="150KV"/> 150kV <br>
name
为selectedLinhaType
的位置。此名称与视图模型上的任何属性都不匹配,因此模型绑定器将简单地丢弃任何已发布的值。该名称必须与要绑定值的属性的名称匹配。您可以手动更改这些属性的name
属性,但更好的方法是让Razor处理它:
@Html.RadioButtonFor(m => m.MyProperty, "foo")
其中MyProperty
是要绑定到已发布值的属性,而"foo"
是此单选按钮应具有的值。