2017-09-16 70 views
0

我试图用具有使用ViewModel的下拉列表的数据填充编辑视图。数据会填充,但Dropdownlists不会根据数据进行选择。使用ViewModel编辑时选择的DropDownList

已经在SO [SO1] [1],SO2SO3中查看过类似的问题,但无法解决。知道这可能是我失踪但无法找到的傻事。

代码: 视图模型:

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

查看:

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

得到任何帮助。提前致谢。 [1]:Binding Viewmodel Property to dropdown selected item in razor

到下拉菜单选择项功能于剃刀

+0

您是否说要使用已选择的值加载下拉列表?像这样的问题,例如:https://stackoverflow.com/questions/27901175/how-to-get-dropdownlist-selectedvalue-in-controller-in-mvc – MUlferts

回答

1

你会想,如果你想在模型传递给视图之前设置的初始值到控制器中的所选值下拉列表以预选值加载。例如:

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

这个问题并打破这个过程下来了伟大的工作:How to get DropDownList SelectedValue in Controller in MVC

1

无论你在selectedValue参数的设定SelectList将被忽略。为什么?因为您有strongly typed view,并且您正在将ProductVMSupplierID属性绑定到下拉菜单。在您的GetProductById方法中,您实际上并未填充productVM.SupplierIDUnitIDItemCategoryID。所以他们将有默认的int值,0。当我们不使用强类型view小号

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

可选selectedValue参数通常用于:

所以,你可以你的方法改变了这一点。如果您要将视图更改为以下内容,那么您的下拉列表将预先选择该值:

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

感谢adiga为你的时间和清晰的解释 – user2695433