我试图在ASP MVC 5中使用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>
控制器并不重要,因为发布到它的值已经很糟糕了。
我发现的是,在Create视图中,生成的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 :(得分: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)