Search code examples
asp.net-coremodel-view-controllerfilterhtml.dropdownlistfor

HTML.DropDownListFor not passing parameter to controller?


i am trying to filter my view for a couple of hours by now. This is what i have: My View:

@using (Html.BeginForm("Index", "RH_CentroCusto", FormMethod.Get))
{
   @Html.DropDownListFor(f => f.DepartmentoSelecionado , Model.Departamentos, "Select")
}

in my Model Class :

 public IEnumerable<SelectListItem> Departamentos { get; set; }
 public string DepartmentoSelecionado { get; set; }

My controller:

//i want to receive the value in departamentoSelecionado !!
 public IActionResult Index( string searchString, string departamentoSelecionado = "", int page = 1)
     
     
            List<SelectListItem> selectList = new List<SelectListItem>();

            foreach (var x in _context.RH_Departamento.ToList())
            {
                selectList.Add(new SelectListItem() { Text = x.Departamento , Value = x.Departamento           });
            }

//and then i add to the viewModel that i create the list
        ViewModelCentroCusto vmcc = new ViewModelCentroCusto()
            {  
                   Departamentos = selectList
            }

When i try to select one and click enter, it is suposed to be passing because in my browser i inspected and it was passing query parameters:

enter image description here

But in my controller my departamentoSelecionado is null, also the dropdown list gets the "select" again instead of keeping what i choose before! Any help is appreciated!


Solution

  • Change departamentoSelecionado to departmentoSelecionado . You spelt an extra letter a in departmentoSelecionado .

    //public IActionResult Index( string searchString, string departamentoSelecionado = "", int page = 1)
      public IActionResult Index( string searchString, string departmentoSelecionado = "", int page = 1)
    

    The parameter in action method should be same as f => f.DepartmentoSelecionado.




    Update 16/09/2020

    Codes of controller

    public class RH_CentroCustoController : Controller
    {
       
        //i want to receive the value in departamentoSelecionado !!
        public IActionResult Index(string searchString, string departmentoSelecionado ="", int page = 1)
        {
            List<SelectListItem> selectList = new List<SelectListItem>();
    
            IList<RH_Departamento> RH_Departamento = new List<RH_Departamento>(){
                new RH_Departamento(){ Departamento="dep1" },
                new RH_Departamento(){ Departamento="dep2" },
                new RH_Departamento(){ Departamento="dep3" },
            };//just for test 
            //foreach (var x in _context.RH_Departamento.ToList())
            foreach (var x in RH_Departamento.ToList())
            {
                selectList.Add(new SelectListItem() { Text = x.Departamento, Value = x.Departamento });
            }
    
            //and then i add to the viewModel that i create the list
            ViewModelCentroCusto vmcc = new ViewModelCentroCusto()
            {
                Departamentos = selectList
            };
    
            return View(vmcc);
        }
    }
    

    Codes of View

    @model xxx.Models.ViewModelCentroCusto
    @{
        Layout = null;
    }
    
    @using (Html.BeginForm("Index", "RH_CentroCusto", FormMethod.Get))
    {
        @Html.DropDownListFor(f => f.DepartmentoSelecionado, new SelectList(Model.Departamentos, "Value", "Text"), "Select");
        <input type="submit" value="Save" />
    }
    

    Codes of Model

    public class ViewModelCentroCusto
    {
        public IEnumerable<SelectListItem> Departamentos { get; set; }
        public string DepartmentoSelecionado { get; set; }
    }
    
    public class RH_Departamento
    {
        public string Departamento { get; set; }
    }
    

    Test

    enter image description here