2017-08-27 169 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> 

控制器並不重要,因爲發佈到它的值是本來就不好。

我沒發現的是,在所生成的創建視圖,HTML只是一個簡單的列表:

<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屬性:

<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

@Richard但我從來沒有明確設置初始值...模型綁定做到了。那麼爲什麼當我選擇別的東西時,它會保持這種狀態? – 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