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。

在您的 ViewModel 中再添加一个名为“ SelectedCategoryID”的属性,如下所示

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 回答