【问题标题】:Looking for help on creating DropDownListFor from ViewModel寻求有关从 ViewModel 创建 DropDownListFor 的帮助
【发布时间】:2014-12-17 10:07:08
【问题描述】:

看看这个链接http://odetocode.com/blogs/scott/archive/2013/03/11/dropdownlistfor-with-asp-net-mvc.aspx,代码显示如下:

public class ViewModel
{
    private readonly List<IceCreamFlavor> _flavors;

    [Display(Name = "Favorite Flavor")]
    public int SelectedFlavorId { get; set; }

    public IEnumerable<SelectListItem> FlavorItems
    {
        get { return new SelectList(_flavors, "Id", "Name");}
    }
}

链接页面上代码块下方的行提到从某处的数据库中填充 _flavors。我的问题是,这会在哪里?将数据直接拉入 ViewModel 而不是 Controller 是正常的做法吗?如果是这样,我是否只需创建一个构造函数并将我的 DAL 放入其中以填充 _flavors?由于它是只读的,我还有什么其他选择?

【问题讨论】:

  • 如果它是只读的,那么您只能在构造函数中设置值,并且在从服务或直接从上下文中获取实际数据后,您显然会在控制器中实例化您的视图模型
  • 由于发布后返回视图需要重新分配SelectList,所以应该是public IEnumerable&lt;SelectListItem&gt; FlavorItems { get; set; }并在控制器中分配
  • 我刚才问了一个类似的问题,可以在这里找到*.com/questions/6387120/…

标签: c# asp.net-mvc html.dropdownlistfor selectlist


【解决方案1】:

不知道为什么要将_flavors 设为只读,尤其是当 ViewModel 类上没有构造函数时 - 对我来说似乎是一个错误/错字。不幸的是 odetocode.com 似乎已关闭,所以我只能建议以下解决方案:

制作一个非常简单的 ViewModel 类

public class ViewModel
{
    public List<IceCreamFlavor> Flavors { get; set; }

    [Display(Name = "Favorite Flavor")]
    public int SelectedFlavorId { get; set; }

    public IEnumerable<SelectListItem> FlavorItems
    {
        get { return new SelectList(Flavors, "Id", "Name");}
    }
}

在控制器操作方法中实例化 ViewModel

public ActionResult CreateFlavour() {
    var model = new ViewModel {
        Flavors = GetFlavorsFromDB(); // This is a fake method, supposed to get your data 
    }

    return View(model);
}

在您的视图中致电DropDownListFor

@Html.DropDownListFor(m => m.SelectedFlavorId, Model.FlavorItems, 'Please select a flavor')

有关更多详细信息,请查看我关于如何在 ASP.NET MVC 中使用 DropDownListFor 的文章:'Using simple Drop Down Lists in ASP.NET MVC'

【讨论】:

  • FlavorItems 上没有设置器,所以在初始化 ViewModel 时无法赋值
  • @StephenMuecke FlavorItems 只是一个吸气剂 - 控制器将项目分配给 .Flavors,而不是 .FlavorItems