@ Html.Dropdownlist returns null value

1
ASP.NET MVC4

I have a data dropdown problem of a dropdownlist where the same list correctly the values, but when choosing some value and posting on the page the value arrives as null in the controller.

My Domain 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 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 controler, I have a ViewBag that passes all the categories registered in the database to be used as Dropdownlist in creating or changing 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% change% I have View that generates the right data, just need to add an empty option at the beginning with the Select a Category option that I still do not know how to do.

@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 out the other requirements of the form and sending the data ... no Dropdownlist of HttpPost :

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

You are returning the value of the Category as controler . ai returns to the page with the redone 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 Category field is as NULL , and if I manually register in the database the SQL Server displays the contents registered correctly.

    
asked by anonymous 06.06.2015 / 02:52

1 answer

1

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

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

public string selectedValue { get; set; }

And here for

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