8

おそらく単純ですが、何かが足りないようです。

2つのモデル:

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)\

ただし、これを行うにはもっと良い方法があるはずです。おそらく、SelectList型のプロパティを使用してハードウェアから継承するviewModelを作成しますか?

4

1 に答える 1

17

アプリケーションがますます複雑になるにつれて、MVCアプリケーションがM-VM-VCに変わるのがわかります。VMは専用のViewModelであり、通常、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 に答える