DropDownListFor对编辑帖子没有约束力

时间:2017-08-27 20:12:50

标签: c# asp.net-mvc razor model-binding dropdownlistfor

我试图在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() });
                }
            }
        }

有什么建议吗?

1 个答案:

答案 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)
相关问题