DropDownList使用ViewModel在Edit上选择

时间:2017-09-16 17:13:40

标签: c# asp.net-mvc asp.net-mvc-4 ef-code-first

我正在尝试使用具有使用ViewModel的下拉列表的数据填充编辑视图。填充数据但未按数据选择下拉列表。

已检查过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

到下拉选择项功能于剃刀

2 个答案:

答案 0 :(得分: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 :(得分:1)

您在selectedValue的{​​{1}}参数中设置的内容将被忽略。为什么?因为您有一个strongly typed view,并且您将SelectList属性SupplierID绑定到下拉列表。在ProductVM方法中,您实际上并未填充GetProductByIdproductVM.SupplierIDUnitID。因此,它们将具有默认的int值ItemCategoryID

所以你可以改变你的方法:

0

当我们不使用强类型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参数。如果您要将视图更改为以下内容,则您的下拉列表将预先选择值:

view