2017-08-27 1 views
0

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?

+0

"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

+0

On dirait que l'ID des deux listes déroulantes est identique. – Prajwal

+0

@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

Répondre

1

Essayez le code suivant:

Modèle ProizvodjacViewModel

public IEnumerable<SelectListItem> VendorList { get; set; } 

Contrôleur

 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); 

Voir

@Html.DropDownListFor(model => model.VendorList, Model.VendorList) 
+0

Merci pour la réponse, mais vous avez une idée pourquoi cela ne fonctionne pas sur Modifier quand cela fonctionne sur Créer?Ce n'est pas le seul endroit dans l'application que c'est un problème et je détesterais changer tous les modèles que j'ai besoin d'une liste de quelque chose pour exister :) – dzenesiz