編集ビューを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() });
}
}
}
任意のアドバイスはありますか?
"しかし、編集ビューでは、[...]":それはあなたがHTの初期値を設定する方法ですドロップダウンのML(すなわち、 'select'要素)を変更する必要があります。 – Richard
両方のドロップダウンのIDが同じであるように見えます。 – Prajwal
@リチャードしかし、私は明示的に初期値を設定したことはありません...モデルバインディングはそれを行いました。だから私は何か他のものを選ぶと、それはなぜそのままになるのだろうか? – dzenesiz