如何在ModelState.IsValid之后的返回视图上保留模型值

时间:2017-07-13 15:20:05

标签: c# asp.net asp.net-mvc

我还是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; }
    }

}

1 个答案:

答案 0 :(得分:1)

您的收音机就像:

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

nameselectedLinhaType的位置。此名称与视图模型上的任何属性都不匹配,因此模型绑定器将简单地丢弃任何已发布的值。该名称必须与要绑定值的属性的名称匹配。您可以手动更改这些属性的name属性,但更好的方法是让Razor处理它:

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

其中MyProperty是要绑定到已发布值的属性,而"foo"是此单选按钮应具有的值。