Mohammad
Mohammad

Reputation: 1304

How can use MVC DropDownlist

I have a problem with DropDownlist in MVC I use ModelView in my application and this is my code

namespace MedicallexiconProject.ViewModel
{
    public class WordViewModel
    {
        private readonly ICategoryService _categoryService;
        public WordViewModel(ICategoryService categoryService)
        {
            _categoryService = categoryService;
            var selectList = _categoryService.GetAllCategorysSelectList().
                Select(x => new SelectListItem
                {
                    Text = x.Name,
                    Value = x.ID.ToString()
                }).ToList();
            Categories = selectList;
        }

        public WordViewModel()
        {

        }
        public string Name { get; set; }
        private IList<SelectListItem> _categories;
        public IList<SelectListItem> Categories
        {
            get
            {
                if (_categories == null)
                {
                    _categories = new List<SelectListItem>();
                }
                return (_categories);
            }

            set { _categories = value; }
        }
    }
}

and this is my controller

[HttpGet]
public ActionResult Create()
{
    var wordViewModel = new WordViewModel(_categoryService);
    ViewBag.CategoryID = wordViewModel.Categories;
    return View();
}

[HttpPost]
public ActionResult Create(WordViewModel wordViewModel)
{
    Mapper.CreateMap<WordViewModel, Word>();

    var word = new Word();
    Mapper.Map(wordViewModel, word);

    if (ModelState.IsValid)
    {
        _wordService.AddNewWord(word);
        _uow.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(wordViewModel);
}

Now how can I insert dropdownlist in my View?

Upvotes: 1

Views: 161

Answers (2)

kman
kman

Reputation: 1

It's absolutely fine to include code that loads a dropdown list in your view model. A select list and a drop down are both "view" items.... they are not related to business logic and your controller and model need not know anything about SelectLists or SelectListItems or DropDownList, etc.

Upvotes: 0

Shyju
Shyju

Reputation: 218942

As AlfalfaStrange mentioned, you should not add logic in your ViewModel. That makes it ugly ! Keep your ViewModel simple POCO.

Add one more property in your ViewModel called "SelectedCategoryID" like this

public class WordViewModel
{
  public int SelectedCategoryID { set;get;}
  public IList<SelectListItem> Categories { set;get;}
  public string Name { set;get;}
}

Initialize your Items (Categories) of your ViewModel in your GET method. Here i am calling a method called GetCategories which returns a list of categories.I can simply call the method wherever i want.

public ActionResult Create()
{
   var model=new WordViewModel();
   model.Categories=YourService.GetCategories();
   return View(model);
}

In your strongly typed Create view , use this

@model WordViewModel
using(@Html.BeginForm())
{

  @Html.DropDownFor(x=>x.SelectedCategoryID,
               new SelectList(Model.Categories,"Value","Text"),"Select Category")
  <input type="submit" value="Save" />
}

In your HttpPost action method , you can check for wordViewModel.SelectedCategoryID for the selected value.

[HttpPost]
public ActionResult Create(WordViewModel wordViewModel)
{
   if(ModelState.IsValid)
   {
     //Checck for wordViewModel.SelectedCategoryID here now
   }
   //some validation failed. Let's reload the category data again.
   wordViewModel.Categories=YourService.GetCategories();
   return View(wordViewModel);
}

Upvotes: 3

Related Questions