asp.net mvc 模型联编程序不适用于编辑模式下的下拉列表
asp.net mvc model binder does not work for drop down list in edit mode
为什么模型活页夹在编辑模式下对下拉列表不起作用?
在编辑视图中我编写了这段代码并测试了两个不同的 ddl :
@Html.DropDownList("ProductParentCategoryId", null, htmlAttributes: new { @class = "form-control" })
@Html.DropDownListFor(model => model.ProductParentCategoryId, (SelectList)ViewBag.ParentId)
在我的控制器中
ViewBag.ProductParentCategoryId = new SelectList(_productCategoryService.GetAllProductCategory(), "ProductCategoryId", "ProductCategoryTitle");
ViewBag.ParentId = new SelectList(_productCategoryService.GetAllProductCategory(), "ProductCategoryId", "ProductCategoryTitle");
但编辑模式下的所有文本框都填充了模型活页夹,但下拉列表不会发生这种情况。
为什么?
--------更新日期--------
我的意思是处于编辑模式,模型活页夹将数据库中的所有数据绑定到文本框中,每个元素...
但在下拉列表模型中,活页夹不会将数据库中的数据作为 Selected Value 绑定到下拉列表
我建议您绑定到视图模型而不是使用 ViewBag。
但是为了回答您的问题,在您的第一个示例中,您没有传递项目来填充下拉列表(第二个参数),而是传递了一个空值。
还有我一直使用的下拉菜单
IEnumerable<SelectListItem>
相对于 SelectList 集合。
因此,在您的视图模型中,您可以创建一个 属性,例如:public IEnumerable<ProductCategory> ProductCategories {get; set;}
并将其绑定到您的下拉列表,如下所示:
Html.DropDownListFor(m => m.ProductCategoryId, Model.ProductCategories)
https://msdn.microsoft.com/en-us/library/gg548304(v=vs.111).aspx
我找到了我的解决方案
唯一应该在我的控制器中完成的事情:
[http Get]
public ActionResult Edit(int id)
{
var selectedId = _productCategoryService.GetOneProductCategory(id);
ViewBag.ProductParentCategoryId = new SelectList(_productCategoryService.GetAllProductCategory(), "ProductCategoryId", "ProductCategoryTitle", (int)selectedId.ProductParentCategoryId);
ViewBag.GroupFiltersId = new SelectList(_groupFiltersService.GetAllGroupFilter().Where(a => a.GroupFilterParentId == null), "GroupFilterId", "GroupFilterTitle");
return View(_productCategoryService.GetOneProductCategory(id));
}
查看:
@Html.DropDownList("ProductParentCategoryId", null, htmlAttributes: new { @class = "form-control" })
为什么模型活页夹在编辑模式下对下拉列表不起作用?
在编辑视图中我编写了这段代码并测试了两个不同的 ddl :
@Html.DropDownList("ProductParentCategoryId", null, htmlAttributes: new { @class = "form-control" })
@Html.DropDownListFor(model => model.ProductParentCategoryId, (SelectList)ViewBag.ParentId)
在我的控制器中
ViewBag.ProductParentCategoryId = new SelectList(_productCategoryService.GetAllProductCategory(), "ProductCategoryId", "ProductCategoryTitle");
ViewBag.ParentId = new SelectList(_productCategoryService.GetAllProductCategory(), "ProductCategoryId", "ProductCategoryTitle");
但编辑模式下的所有文本框都填充了模型活页夹,但下拉列表不会发生这种情况。
为什么?
--------更新日期--------
我的意思是处于编辑模式,模型活页夹将数据库中的所有数据绑定到文本框中,每个元素... 但在下拉列表模型中,活页夹不会将数据库中的数据作为 Selected Value 绑定到下拉列表
我建议您绑定到视图模型而不是使用 ViewBag。
但是为了回答您的问题,在您的第一个示例中,您没有传递项目来填充下拉列表(第二个参数),而是传递了一个空值。
还有我一直使用的下拉菜单
IEnumerable<SelectListItem>
相对于 SelectList 集合。
因此,在您的视图模型中,您可以创建一个 属性,例如:public IEnumerable<ProductCategory> ProductCategories {get; set;}
并将其绑定到您的下拉列表,如下所示:
Html.DropDownListFor(m => m.ProductCategoryId, Model.ProductCategories)
https://msdn.microsoft.com/en-us/library/gg548304(v=vs.111).aspx
我找到了我的解决方案 唯一应该在我的控制器中完成的事情:
[http Get]
public ActionResult Edit(int id)
{
var selectedId = _productCategoryService.GetOneProductCategory(id);
ViewBag.ProductParentCategoryId = new SelectList(_productCategoryService.GetAllProductCategory(), "ProductCategoryId", "ProductCategoryTitle", (int)selectedId.ProductParentCategoryId);
ViewBag.GroupFiltersId = new SelectList(_groupFiltersService.GetAllGroupFilter().Where(a => a.GroupFilterParentId == null), "GroupFilterId", "GroupFilterTitle");
return View(_productCategoryService.GetOneProductCategory(id));
}
查看:
@Html.DropDownList("ProductParentCategoryId", null, htmlAttributes: new { @class = "form-control" })