2017-09-16 5 views
0

J'essaie de remplir la vue d'édition avec des données qui ont des listes déroulantes utilisant ViewModel. Les données sont remplies mais les listes déroulantes ne sont pas sélectionnées selon les données.DropDownList à sélectionner sur Modifier à l'aide de ViewModel

Avoir vérifié des problèmes similaires dans SO comme [SO1] [1], SO2, SO3 mais pas en mesure de résoudre. Sachez que c'est peut-être quelque chose d'idiot qui me manque mais que je ne trouve pas.

code: viewmodel:

public class ProductVM 
    { 
     public int ID { get; set; } 
     [Required] 
     [DisplayName("Product Name")] 
     public string ProductName { get; set; } 

     public int SupplierID { get; set; } 
     public IEnumerable<SelectListItem> Suppliers { get; set; } 
     public Supplier Supplier { get; set; } 

     public int UnitID { get; set; } 
     public IEnumerable<SelectListItem> Units { get; set; } 
     public Unit Unit { get; set; } 

     public int ItemCategoryID { get; set; } 
     public IEnumerable<SelectListItem> Categories { get; set; } 
     [DisplayName("Categories")] 
     public ItemCategory ItemCategory { get; set; } 
    } 
Controller Edit : 
    public ActionResult Edit(int id) 
     { 
      var productVM = GetProductById(id); 


      return View(productVM); 
     } 
private ProductVM GetProductById(int id) 
     { 
      Product product = db.Products.Find(id); 

      var productVM = new ProductVM(); 


      var suppliers = new SelectList(db.Suppliers, "ID", "SupplierName", product.SupplierID); 
      productVM.Suppliers = suppliers.ToList(); 

      var categories = new SelectList(db.ItemCategories, "ID", "Name", product.ItemCategoryID); 
      productVM.Categories = categories.ToList(); 

    var units = new SelectList(db.Units, "ID", "Name", product.UnitID); 
      productVM.Units = units.ToList(); 
     } 

Vue:

<div class="form-group"> 
      @Html.LabelFor(model => model.ProductName, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.ProductName, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.ProductName, "", new { @class = "text-danger" }) 
      </div> 
     </div> 


     </div> 
     <div class="form-group"> 
      @Html.LabelFor(model => model.SupplierID, "SupplierID", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 

       @Html.DropDownListFor(u => u.SupplierID, Model.Suppliers, "--Select--") 

       @Html.ValidationMessageFor(model => model.SupplierID, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.UnitID, "UnitID", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(u => u.UnitID, (IEnumerable<SelectListItem>)Model.Units, "--Select--") 
       @Html.ValidationMessageFor(model => model.UnitID, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ItemCategoryID, "ItemCategoryID", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DropDownListFor(u => u.ItemCategoryID, (IEnumerable<SelectListItem>)Model.Categories, "--Select--") 
       @Html.ValidationMessageFor(model => model.ItemCategoryID, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

apprécierais toute aide. Merci d'avance. [1]: Binding Viewmodel Property to dropdown selected item in razor

à menu déroulant sélectionné items en rasoir

+0

Voulez-vous que les listes déroulantes soient chargées avec les valeurs déjà sélectionnées? Comme avec cette question par exemple: https://stackoverflow.com/questions/27901175/how-to-get-dropdownlist-selected-in-controller-in-mvc – MUlferts

Répondre

1

vous voulez définir une valeur initiale dans vos valeurs sélectionnées dans le contrôleur avant de passer le modèle à la vue si vous voulez les listes déroulantes à charger avec une valeur présélectionnée. Par exemple:

public ActionResult Edit(int id) 
{ 
    var productVM = GetProductById(id); 
    //Set your pre-determined values here and they will show up on the view once binded 
    productVM.SupplierID = 1; 
    productVM.UnitID = 1; 
    productVM.ItemCategoryID = 1; 

    return View(productVM); 
} 

Cette question fait un excellent travail de briser ce processus vers le bas: How to get DropDownList SelectedValue in Controller in MVC

1

Tout ce que vous définissez dans le paramètre selectedValue dans le SelectList va être ignoré. Pourquoi? Parce que vous avez un strongly typed view et vous liez la propriété SupplierID de ProductVM à la liste déroulante. Dans votre méthode GetProductById, vous ne remplissez pas réellement les , UnitID et ItemCategoryID. Donc, ils auront la valeur int par défaut, 0.

vous pouvez donc changer vous méthode à ceci:

private ProductVM GetProductById(int id) 
{ 
    Product product = db.Products.Find(id); 

    var productVM = new ProductVM 
    { 
     // No need to pass the 4th parameter "selectedValue" in SelectList. 
     Suppliers = new SelectList(db.Suppliers, "ID", "SupplierName"), 
     Categories = new SelectList(db.ItemCategories, "ID", "Name"), 
     Units = new SelectList(db.Units, "ID", "Name"), 

     // Populate these properties 
     SupplierID = product.SupplierID, 
     ItemCategoryID = product.ItemCategoryID, 
     UnitID = product.UnitID 
    }; 

    return productVM ; 
} 

Le paramètre selectedValue option est généralement utilisé lorsque nous ne sommes pas en utilisant fortement typé view s. Si vous deviez modifier votre vue à ce qui suit, votre liste déroulante aurait pré-sélectionné la valeur:

@Html.DropDownList("Supplier", Model.Suppliers, "--Select--") 
+0

Merci adiga pour votre temps et l'explication claire – user2695433