J'essaie de faire fonctionner l'affichage Edition avec DropDownListFor dans ASP MVC 5, mais quoi que je sélectionne, la valeur affichée reste l'ancienne. Je trouve cela étrange parce que, initialement, l'élément sélectionné est la valeur réelle du modèle. Et cela vaut pour les deux DropDownListFor éléments que j'ai sur la page.DropDownListPour ne pas lier sur le post d'édition
De plus, la même logique fonctionne sur la vue Créer du même automate.
propriétés Modèle:
public List<ProizvodjacViewModel> VendorList { get; set; }
public List<KategorijaViewModel> CategoryList { get; set; }
éléments Vue:
<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>
Le contrôleur est pas important car les valeurs affichées sont déjà à ce mauvais.
Ce que j'ai découvert est que dans la zone Créer vue, HTML généré est juste une simple liste:
<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>
Mais dans la vue d'édition, un attribut selected
est également généré:
<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>
méthodes de contrôleur:
// 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() });
}
}
}
Un conseil?
"Mais dans la vue d'édition, [...]": Voilà comment vous définissez une valeur initiale dans HT ML pour une baisse (ie. élément 'select') reflétant que lors de l'édition, la valeur existante doit être affichée. – Richard
On dirait que l'ID des deux listes déroulantes est identique. – Prajwal
@Richard Mais je n'ai jamais explicitement défini la valeur initiale ... la liaison de modèle l'a fait. Alors pourquoi reste-t-il ainsi quand je choisis quelque chose d'autre? – dzenesiz