8

可能很简单,但我似乎遗漏了一些东西。

两种型号:

public class Hardware
{
    [Required]
    public int Id { get; set; }

    public int SerialNum { get; set; }
    public int ProductNum { get; set; }
    public string Notes { get; set; }
    public DateTime PurchaseDate { get; set; }
    public DateTime WarrantyExpiration { get; set; }

    public virtual Manufacturer Manufacturer { get; set; }
}

public class Manufacturer
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<Hardware> Hardware { get; set; }
}

当我进入硬件创建视图时,我希望能够从制造商的下拉列表中进行选择,并且当它提交时,它应该在硬件和选择的制造商之间建立关系。

目前,我一直在使用以下内容在控制器中构建一个 selectList

SelectList selectList = new SelectList(db.Manufacturers, "Id", "Name");
ViewBag.selectList = selectList;

然后将其投射到视图中:

@Html.DropDownListFor(model => model.Manufacturer, ViewBag.selectList as SelectList)\

但是,似乎应该有更好的方法来做到这一点 - 也许创建一个从 Hardware 继承的具有 SelectList 类型属性的视图模型?

4

1 回答 1

17

随着你的应用程序变得越来越复杂,你会看到你的 MVC 应用程序变成了 M-VM-VC,VM 是专用的 ViewModels,它通常会添加你的 UI 层需要的所有东西来生成 UI。

在这种情况下,我个人不会使用继承,因为您的 ViewModel 不是您的模型的专用版本。这正是您的 UI 创建视图所需要的(这完全取决于您)。

我的 ViewModel 看起来像这样:

public class HardwareVm
{
     public Hardware Hardware { get; set; }
     public IEnumerable<SelectListItem> Manufacturers { get; set; }
} 

在视图中:

@Html.DropDownListFor(model => model.Hardware.Manufacturer,  Manufacturers)

控制器:

var manufacturers = db.Manufacturers.Select(m => new SelectListItem {Text = m.Name, Value = m.Id });
var model = new HardwareVm { Manufacturers = manufacturers };
于 2013-01-22T21:30:35.953 回答