2017-08-27 12 views
0

編集ビューをASP MVC 5のDropDownListForで動作させようとしていますが、選択したものは投稿された値が古いものです。最初は選択したアイテムが実際のモデル値なので、私は奇妙なことに気付きました。そして、それは私がページ上に持っているDropDownListFor要素の両方に当てはまります。DropDownListFor編集ポストにバインドされていません

さらに、同じロジックが同じコントローラの作成ビューで機能します。

モデルプロパティ:

public List<ProizvodjacViewModel> VendorList { get; set; } 
public List<KategorijaViewModel> CategoryList { get; set; } 

ビュー要素:それに投稿された値がすでに悪いので、

<div class="form-group"> 
      @Html.LabelFor(model => model.ProizvodjacID, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.ProizvodjacID, new SelectList(Model.VendorList, "ID", "Naziv")) 
      </div> 
     </div> 

<div class="form-group"> 
      @Html.LabelFor(model => model.KategorijaId, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(model => model.KategorijaId, new SelectList(Model.CategoryList, "ID", "Naziv")) 
      </div> 
     </div> 

コントローラは重要ではありません。

<select data-val="true" data-val-number="The field ProizvodjacID must be a number." data-val-required="The ProizvodjacID field is required." id="ProizvodjacID" name="ProizvodjacID" aria-required="true" aria-describedby="ProizvodjacID-error" class="valid" aria-invalid="false"> 
    <option value="1">Gibson</option> 
    <option value="2">Hohner</option> 
    <option value="3">Yamaha</option> 
</select> 

しかし、編集ビューで、selected属性も生成されます:私は発見しました何

生成されたビューを作成し、HTMLに単なるリストであるということである

<select id="ProizvodjacID" name="ProizvodjacID" aria-required="true" aria-describedby="ProizvodjacID-error" class="valid" aria-invalid="false"> 
    <option selected="selected" value="1">Gibson</option> 
    <option value="2">Hohner</option> 
    <option value="3">Yamaha</option> 
</select> 

コントローラのメソッド:

// GET: Proizvod/Edit/5 
     [HttpGet] 
     [ActionName("Edit")] 
     public ActionResult EditGet(int id) 
     { 
      ViewBag.Err = ""; 
      ProizvodViewModel p = new ProizvodViewModel() 
      { 
       ID = id, 
       Naziv = "", 
       NazivProizvodjaca = "", 
       CenaOd = 0, 
       CenaDo = Int32.MaxValue 
      }; 

      //goes to DB and gets a product(Proizvod) by id 
      DataSet ds = DAL.ProizvodDAL.Pretraga(p); 

      DataRow dr = ds.Tables[0].Rows[0]; 

      p.Naziv = dr["NAZIV"].ToString(); 
      p.Cena = Convert.ToDecimal(dr["CENA"]); 
      p.SlikaUrl = dr["SLIKA_URL"].ToString(); 
      p.ProizvodjacID = Convert.ToInt32(dr["PROIZVODJAC_ID"]); 
      p.NazivProizvodjaca = dr["NAZIV_PROIZVODJACA"].ToString(); 
      p.KategorijaId = Convert.ToInt32(dr["KATEGORIJA_ID"]); 

      //populates VendorList from DB -- code below 
      popuniProizvodjace(p); 

      //same, but with CategoryList -- code below 
      popuniKategorije(p); 

      return View(p); 
     } 

// POST: Proizvod/Edit/5 
     [HttpPost] 
     [ActionName("Edit")] 
     public ActionResult EditPost(ProizvodViewModel proizvod) 
     { 
      try 
      { 
       // TODO: Add update logic here 
       if (ModelState.IsValid) 
       { 
        if (proizvod.ListaKategorija == null) 
         popuniKategorije(proizvod); 
        if (proizvod.ListaProizvodjaca == null) 
         popuniProizvodjace(proizvod); 

        int rezultat = 1; 
        string poruka; 

        //updates the product in DB 
        DAL.ProizvodDAL.Izmena(proizvod, out rezultat, out poruka); 
        if (rezultat != 0) 
        { 
         ViewBag.Err = poruka; 
         return View(proizvod); 
        } 
        return RedirectToAction("Index"); 
       } 
       else 
       { 
        return View(proizvod); 
       } 
      } 
      catch (Exception ex) 
      { 
       ViewBag.Err = ex.Message; 
       return View(proizvod); 
      } 
     } 

private void popuniProizvodjace(ProizvodViewModel proizvod) 
     { 
      // gets all vendors (Proizvodjac) from DB 
      DataSet ds = DAL.ProizvodjacDAL.Pretraga(new ProizvodjacViewModel() { Naziv = "", ID = 0 }); 
      if (AetFunkcije.proveriDataSet(ds)) 
      { 
       proizvod.VendorList = new List<ProizvodjacViewModel>(); 

       foreach (DataRow dr in ds.Tables[0].Rows) 
       { 
        proizvod.VendorList.Add(new ProizvodjacViewModel() { ID = Convert.ToInt32(dr["PROIZVODJAC_ID"]), Naziv = dr["NAZIV"].ToString() }); 
       } 
      } 
     } 

     private void popuniKategorije(ProizvodViewModel proizvod) 
     { 
      // gets all categories (Kategorija) from DB 
      DataSet ds = DAL.KategorijaDAL.Pretraga(new KategorijaViewModel() { ID = 0, Naziv = "" }); 
      if (AetFunkcije.proveriDataSet(ds)) 
      { 
       proizvod.ListaKategorija = new List<KategorijaViewModel>(); 

       foreach (DataRow dr in ds.Tables[0].Rows) 
       { 
        proizvod.CategoryList.Add(new KategorijaViewModel() { ID = Convert.ToInt32(dr["KATEGORIJA_ID"]), Naziv = dr["NAZIV"].ToString() }); 
       } 
      } 
     } 

任意のアドバイスはありますか?

+0

"しかし、編集ビューでは、[...]":それはあなたがHTの初期値を設定する方法ですドロップダウンのML(すなわち、 'select'要素)を変更する必要があります。 – Richard

+0

両方のドロップダウンのIDが同じであるように見えます。 – Prajwal

+0

@リチャードしかし、私は明示的に初期値を設定したことはありません...モデルバインディングはそれを行いました。だから私は何か他のものを選ぶと、それはなぜそのままになるのだろうか? – dzenesiz

答えて

1

てみてください以下のコード:

モデルProizvodjacViewModel

public IEnumerable<SelectListItem> VendorList { get; set; } 

コントローラ

 var obj = new ProizvodjacViewModel(); 
     List<SelectListItem> VendorList = new List<SelectListItem> 
     { 
      new SelectListItem() { Value = "Gibson", Text = "Gibson" }, 
      new SelectListItem() { Value = "Hohner", Text = "Hohner" }, 
      new SelectListItem() { Value = "Yamaha", Text = "Yamaha" } 
     }; 
     obj.VendorList = VendorList; 
     return view(obj); 

ビュー

@Html.DropDownListFor(model => model.VendorList, Model.VendorList) 
+0

答えに感謝します。でも、作成時に編集で編集がうまくいかない理由がありますか?これは問題だと私は何かのリストが存在する必要があるすべてのモデルを変更することは嫌いだろう、アプリ内の唯一の場所ではありません:) – dzenesiz

関連する問題