如何在 .NET MVC 中使用选定值在编辑视图中显示动态下拉列表?
How to display dynamic dropdownlists in Edit view with selected values in .NET MVC?
我有一个表单,其中包含三个动态下拉列表。它们都是一对多的关系。第一个下拉列表已加载值,其他两个在开始时为空。当用户从第一个下拉列表中选择一个值时,第二个下拉列表将加载相应的项目;当用户从第二个下拉列表中选择一个值时,第三个下拉列表将加载相关项目。
用户可以创建表单并提交。我的 CreateController GET 和 POST 方法运行良好。
现在我需要 EditController 来允许用户编辑他的表单。问题是如何显示带有选定值的第二个和第三个动态下拉列表?
在我的视图模型中:
public Nullable<int> Tech_ID { get; set; }
public string TechniqueName { get; set; }
public SelectList Techniques { get; set; }
public Nullable<int> BU_ID { get; set; }
public string BuName { get; set; }
public SelectList BusinessUnits { get; set; }
在我的编辑控制器中:
ViewBag.Bulist = new SelectList(AllBus, "BU_ID", "BU_Title", form.BU_ID);
var butechList = GetTechList(Convert.ToInt32(form.BU_ID));
IEnumerable<SelectListItem> butechs = butechList.Select(m => new SelectListItem()
{
Value = m.Tech_ID.ToString(),
Text = m.Technique.Tech_Title
});
ViewBag.Techlist = new SelectList(butechs, "Tech_ID", "Tech_Title", form.Tech_ID);
在查看页面中:
@Html.DropDownListFor(model => model.BU_ID,
new SelectList((IEnumerable<SelectListItem>)@ViewBag.Bulist, "Value", "Text", Model.BU_ID),
new { id = "ddlBU" })
@Html.DropDownListFor(model => model.Tech_ID,
new SelectList((IEnumerable<SelectListItem>)@ViewBag.Techlist, "Value", "Text", Model.Tech_ID),
new { id = "ddlTechs" })
第一个下拉列表工作正常,但第二个不是。
首先,您有一个包含 SelectList
属性的视图模型,因此请使用它而不是使用 ViewBag
属性。
接下来,删除 SelectList
构造函数中不必要的最后一个参数 (object selectedValue
) - 您绑定到模型中的 属性,因此它会被忽略(内部 DropDwonListFor()
方法生成了一个新的 IEnumerable<SelectListItem>
并根据绑定到的 属性 的值设置了 selectedValue
)
但主要问题是您不必要地生成了 3 IEnumerable<SelectListItem>
。第一个使用
IEnumerable<SelectListItem> butechs = butechList.Select(...
这是正确的。然后您尝试使用
创建另一个表格
ViewBag.Techlist = new SelectList(butechs, "Tech_ID", "Tech_Title", form.Tech_ID);
但是这次它会抛出异常,因为butechs
是IEnumerable<SelectListItem>
并且SelectListItem
不包含属性Tech_ID
和Tech_Title
(它需要是 new SelectList(butechs, "Value", "Text")
以防止错误,但它没有意义所以只是删除它)。然后你尝试在 DropDownListFor()
方法中创建第三个 IEnumerable<SelectListItem>
(同样是毫无意义的额外开销)。
您在控制器中的代码只需
var butechList = GetTechList(form.BU_ID.Value); // its already an int!
model.Techniques = new SelectList(butechList, "Tech_ID", "Tech_Title");
return View(model);
并在视图中
@Html.DropDownListFor(m => m.Tech_ID, Model.Techniques) // not sure why you would need to change the id from the default id="Tech_ID" to id="ddlBU"?
我还建议您研究 this DotNetFiddle 中的代码,其中显示了生成级联下拉列表的示例。特别是 private void ConfigureViewModel(ViewModel model)
方法中的代码,它将根据所选值生成正确的 SelectList
,并且可以从 Create()
和 Edit()
方法中调用( GET 和 POST 如果你需要 return 视图)
我有一个表单,其中包含三个动态下拉列表。它们都是一对多的关系。第一个下拉列表已加载值,其他两个在开始时为空。当用户从第一个下拉列表中选择一个值时,第二个下拉列表将加载相应的项目;当用户从第二个下拉列表中选择一个值时,第三个下拉列表将加载相关项目。
用户可以创建表单并提交。我的 CreateController GET 和 POST 方法运行良好。
现在我需要 EditController 来允许用户编辑他的表单。问题是如何显示带有选定值的第二个和第三个动态下拉列表?
在我的视图模型中:
public Nullable<int> Tech_ID { get; set; }
public string TechniqueName { get; set; }
public SelectList Techniques { get; set; }
public Nullable<int> BU_ID { get; set; }
public string BuName { get; set; }
public SelectList BusinessUnits { get; set; }
在我的编辑控制器中:
ViewBag.Bulist = new SelectList(AllBus, "BU_ID", "BU_Title", form.BU_ID);
var butechList = GetTechList(Convert.ToInt32(form.BU_ID));
IEnumerable<SelectListItem> butechs = butechList.Select(m => new SelectListItem()
{
Value = m.Tech_ID.ToString(),
Text = m.Technique.Tech_Title
});
ViewBag.Techlist = new SelectList(butechs, "Tech_ID", "Tech_Title", form.Tech_ID);
在查看页面中:
@Html.DropDownListFor(model => model.BU_ID,
new SelectList((IEnumerable<SelectListItem>)@ViewBag.Bulist, "Value", "Text", Model.BU_ID),
new { id = "ddlBU" })
@Html.DropDownListFor(model => model.Tech_ID,
new SelectList((IEnumerable<SelectListItem>)@ViewBag.Techlist, "Value", "Text", Model.Tech_ID),
new { id = "ddlTechs" })
第一个下拉列表工作正常,但第二个不是。
首先,您有一个包含 SelectList
属性的视图模型,因此请使用它而不是使用 ViewBag
属性。
接下来,删除 SelectList
构造函数中不必要的最后一个参数 (object selectedValue
) - 您绑定到模型中的 属性,因此它会被忽略(内部 DropDwonListFor()
方法生成了一个新的 IEnumerable<SelectListItem>
并根据绑定到的 属性 的值设置了 selectedValue
)
但主要问题是您不必要地生成了 3 IEnumerable<SelectListItem>
。第一个使用
IEnumerable<SelectListItem> butechs = butechList.Select(...
这是正确的。然后您尝试使用
创建另一个表格 ViewBag.Techlist = new SelectList(butechs, "Tech_ID", "Tech_Title", form.Tech_ID);
但是这次它会抛出异常,因为butechs
是IEnumerable<SelectListItem>
并且SelectListItem
不包含属性Tech_ID
和Tech_Title
(它需要是 new SelectList(butechs, "Value", "Text")
以防止错误,但它没有意义所以只是删除它)。然后你尝试在 DropDownListFor()
方法中创建第三个 IEnumerable<SelectListItem>
(同样是毫无意义的额外开销)。
您在控制器中的代码只需
var butechList = GetTechList(form.BU_ID.Value); // its already an int!
model.Techniques = new SelectList(butechList, "Tech_ID", "Tech_Title");
return View(model);
并在视图中
@Html.DropDownListFor(m => m.Tech_ID, Model.Techniques) // not sure why you would need to change the id from the default id="Tech_ID" to id="ddlBU"?
我还建议您研究 this DotNetFiddle 中的代码,其中显示了生成级联下拉列表的示例。特别是 private void ConfigureViewModel(ViewModel model)
方法中的代码,它将根据所选值生成正确的 SelectList
,并且可以从 Create()
和 Edit()
方法中调用( GET 和 POST 如果你需要 return 视图)