我正在尝试使用具有使用ViewModel的下拉列表的数据填充编辑视图。填充数据但未按数据选择下拉列表。
已检查过SO中的类似问题,如[SO1] [1],SO2,SO3但无法解决。知道它可能是一些愚蠢的东西,我错过但无法找到。
代码: 视图模型:
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 :(得分: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
方法中,您实际上并未填充GetProductById
,productVM.SupplierID
和UnitID
。因此,它们将具有默认的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