1

2つのモデルがあり、DropDownListに外部キー関係が設定された行をデータベースに挿入したいと思います。Itemモデルのデータは問題なく挿入されますが、ManufacturerIDは挿入されません(nullを挿入します)。理由がわかりませんでした。更新:プロジェクトを次の場所にアップロードしました:http://mvcapplication2.codeplex.com/

<div class="editor-label">
   @Html.LabelFor(model => model.ManufacturerID,"Manufacturer")
</div>

<div class="editor-field">
   @Html.DropDownList("ManufacturerID",string.Empty)
   @Html.ValidationMessageFor(model => model.ManufacturerID)
</div>

public class Item
{
   public int ItemID { get; set; }
   public string Serial { get; set; }
   public string ItemName { get; set; }
   public int? ManufacturerID { get; set; }
   public Manufacturer Manufacturer { get; set; }
}

public class Manufacturer
{
   public int ManufacturerID { get; set; }
   public string ManufacturerName { get; set; }
   public List<Item> Items { get; set; }
}

public ActionResult Create()
{
   ViewBag.ManufacturerID = new SelectList(db.Manufacturers, "ManufacturerID", "ManufacturerName");
   return View();
} 

[HttpPost]
public ActionResult Create(Item ıtem)
{
   if (ModelState.IsValid)
   {
      db.Items.Add(ıtem);
      db.SaveChanges();
      return RedirectToAction("Index"); 
   }

   return View(ıtem);
}
4

3 に答える 3

3

ビューでドメインモデルを使用したくない。ビューに固有のビューモデルをいくつか作成します。また、アクションメソッド(例:ドロップダウンリスト)からデータを転送するには、動的なviewbag / viewdataアプローチではなく、強く型付けされたアプローチを使用します。

ビューモデルクラスを作成する

public class CreateItemVM
{
  public string SerialNumber { set;get;}
  public int SelectedManufactureID { set;get;}
  public List<SelectListItem> Manufacturers { set;get;}
  public CreateItemVM()
  {
     Manufacturers =new List<SelectListItem>();
  }     
}

次に、GETアクションメソッドで、ビューモデルのオブジェクトを作成し、関連する値を初期化して、ビューに送信します。

public ActionResult Create()
{
  var vm=new CreateItemVM();
  vm.Manufacturers=GetManufacturerList();
  return View(vm);
}
private List<SelectListItem> GetManufacturerList()
{
    List<SelectListItem> manuList=new List<SelectListItem>();
    manuList=(from p in  db.Manufacturers
                   select new SelectListItem { 
                                               Value=p.ID.ToString(),
                                               Text=p.Name}
              ).ToList();
    return manuList;
}

ビューモデルに強く型付けされたビューでは、

@model CreateItemVM
@using(Html.Beginform())
{
  @Html.DropDownListfor(x=>x.SelectedManufactureID ,
                                      Model.Manufacturers,"select")
  <input type="submit" />
}

最後に、POSTアクションメソッドで、投稿されたビューモデルから値を読み取り、それをドメインオブジェクトのプロパティ値として割り当てて保存します。選択したメーカーIDの値は、ビューモデルのSelectedManufactureIDプロパティに含まれます。

[HttpPost]
public ActionResult Create(CreateItemVM model)
{
  if(ModelState.IsValid)
  {
     Item domainObject=new Item();
     domainObject.ManufacturerID =model.SelectedManufactureID ;
     //set other relevant properties also
      db.Items.Add(ıtem);
      db.SaveChanges();
      return RedirectToAction("Index");
  } 
  // reload the dropdown before returning to the view
  model.Manufacturers=GetManufacturerList();
  return View(model);   
}
于 2013-01-25T21:54:01.937 に答える
1

プロパティを仮想化し、属性を追加して、関係をより明確にするようにしてください。

public class Item
{
    ...
    [ForeignKey("Manufacturer")]
    public int? ManufacturerID { get; set; }
    public virtual Manufacturer Manufacturer { get; set; }
}

public class Manufacturer
{
    ...
    public virtual List<Item> Items { get; set; }
}

編集:

そして、ドロップダウンを構築するためのより緊密な方法を使用できます。

@Html.DropDownListfor(x=>x.SelectedManufactureID ,
                                  ViewBag.ManufacturerID as SelectList,"Choose one")

編集2:

より良いアプローチは、データを表すためにビューの特定のモデル(ViewModelと呼ばれる)を作成し、@Shyjuが言ったようにビューを構築することです。

于 2013-01-25T21:15:37.047 に答える
0

問題が見つかりました。ビューに送信していたViewbagはManufacturerIDという名前にする必要があります。Manufacturersを送信していたのですが、ドロップダウンにデータが表示されていても、どういうわけか一致していませんでした。

于 2013-01-26T23:04:13.650 に答える