1

MVCのDropDownlistに問題があります。アプリケーションでModelViewを使用していますが、これが私のコードです。

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

これが私のコントローラーです

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

ビューにドロップダウンリストを挿入するにはどうすればよいですか?

4

2 に答える 2

3

AlfalfaStrangeが述べたように、ViewModelにロジックを追加しないでください。それは醜いです!ViewModelをシンプルなPOCOに保ちます。

SelectedCategoryIDこのように""という名前のプロパティをViewModelにもう1つ追加します

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

メソッドでのアイテム(カテゴリ)を初期化ViewModelしますGET。ここでは、カテゴリのリストを返すGetCategoriesというメソッドを呼び出しています。このメソッドは、必要な場所で簡単に呼び出すことができます。

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

強く入力された作成ビューで、これを使用します

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

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

HttpPostアクションメソッドでは、選択した値を確認できますwordViewModel.SelectedCategoryID

[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);
}
于 2012-06-17T16:36:24.763 に答える
0

ビューモデルにドロップダウンリストをロードするコードを含めることは絶対に問題ありません。選択リストとドロップダウンはどちらも「表示」アイテムです。これらはビジネスロジックとは関係がなく、コントローラーとモデルはSelectLists、SelectListItems、DropDownListなどについて何も知る必要はありません。

于 2014-05-20T19:14:25.277 に答える