@Html.Dropdownlist returns null value

Asked

Viewed 336 times

1

ASP.NET MVC4

I’m having a data return problem of a dropdownlist where the same list correctly values, but when choosing some value and post on the page the value arrives as null in the controller.

my Dominio is like this: Table of Contents

namespace VelhosAmigos.WebSite.Dominio.Entidade
{
    public class Conteudo
    {
        [Key]
        [HiddenInput(DisplayValue = false)]
        public int IdConteudo {get; set;}

        [Required(ErrorMessage = "Digite um Título")]
        [Display(Name = "Título: ")]
        [StringLength(150, ErrorMessage = "O Título da publicação não pode ter mais que 150 caracteres.")]
        [Description("Teste de descrição")]
        public string Titulo { get; set; }

        [Required(ErrorMessage = "Digite um Conteúdo para exibição")]
        [Display(Name = "Conteúdo completo: ")]
        [DataType(DataType.MultilineText)]
        public string txt_Conteudo { get; set; }

        //[Required(ErrorMessage = "Escolha uma categoria")]
        [Display(Name = "Categoria: ")]
        public virtual Categoria Categoria { get; set; }

And the Categories table:

namespace VelhosAmigos.WebSite.Dominio.Entidade
{
    public class Categoria
    {
        [Key]
        public int IdCategoria { get; set; }

        public string NomeCategoria { get; set; }

        public int IdSessao { get; set; }

        
    }
}

In the Category repository I have a list of all categories:

namespace VelhosAmigos.WebSite.Dominio.Repositorio
{
    public class CategoriasRepositorio
    {
        private readonly EFDbContext _context = new EFDbContext();

        public IEnumerable<Categoria> Categorias
        {
            get { return _context.Categorias; }
        }

        public List<Categoria> retornarTodas()
        {
            var categorias = (from c in _context.Categorias
                              select c).ToList();

            return categorias;
        }
    }
}

And in the controller, I have a ViewBag that passes all categories registered in the database to be used as Dropdownlist the creation or modification of new content.

       public ViewResult Alterar(int IdConteudo)
        {
            _repositorio = new ConteudosRepositorio();
            Conteudo conteudo = _repositorio.Conteudos
                .FirstOrDefault(c => c.IdConteudo == IdConteudo);

            var _categRepositorio = new CategoriasRepositorio().retornarTodas();
            ViewBag.Categorias = _categRepositorio;

          
            return View(conteudo);

        }

In the View Alter have the Dropdownlist which generates the right data, just add an empty option at the beginning with the Select a Category option that I still can’t do either.

@Html.DropDownListFor(c => c.Categoria, new SelectList(@ViewBag.Categorias, "IdCategoria", "NomeCategoria"), new { @class = "form-control" })

The result of this Dropdownlist is apparently correct:

<select name="Categoria" id="Categoria" class="form-control">
  <option value="1">Fique por Dentro</option>
<option value="2">Artigos</option>
</select>

But when choosing an option and filling the other requirements of the form and submitting the data... on HttpPost of controler:

[HttpPost]
        public ActionResult Alterar(Conteudo conteudo)
        {
            var _categRepositorio = new CategoriasRepositorio().retornarTodas();
            ViewBag.Categorias = _categRepositorio;


            if (ModelState.IsValid)
            {
                if (conteudo.IdConteudo > 0)
                {
                    TempData["mensagem"] = string.Format("{0} foi alterado com sucesso!", conteudo.Titulo);
                }
                else 
                {
                    TempData["mensagem"] = string.Format("{0} foi cadastrado com sucesso!", conteudo.Titulo);
                }


                _repositorio = new ConteudosRepositorio();
                _repositorio.Salvar(conteudo);

                

                return RedirectToAction("Listar");
            };

            
            return View(conteudo);
        }

Is returning as NULL the value of the Category. ai returns to the page with the reset listing and the error below the field:

<span data-valmsg-replace="true" data-valmsg-for="Categoria" class="field-validation-error">The value '1' is invalid.</span>

In the SQL Server, the Category field is listed as int, and if I manually register at the bank the listView displays the contents registered correctly.

1 answer

1

This problem happens because MVC cannot turn the selected value back into the desired model, you can simply create an auxiliary field in your model Conteudo.

//[Required(ErrorMessage = "Escolha uma categoria")]
[Display(Name = "Categoria: ")]
public virtual Categoria Categoria { get; set; }

public string selectedValue { get; set; }

And here to

@Html.DropDownListFor(c => c.selectedValue, new SelectList(@ViewBag.Categorias, "IdCategoria", "NomeCategoria"), new { @class = "form-control" })

Browser other questions tagged

You are not signed in. Login or sign up in order to post.