【问题标题】:How to display dynamic dropdownlists in Edit view with selected values in .NET MVC?如何在 .NET MVC 中使用选定值在编辑视图中显示动态下拉列表?
【发布时间】:2016-01-14 08:15:42
【问题描述】:

我有一个表单,其中包括三个动态下拉列表。它们都是一对多的关系。第一个下拉列表已加载值,另外两个在开始时为空。当用户从第一个下拉列表中选择一个值时,第二个下拉列表将加载相应的项目;当用户从第二个下拉列表中选择一个值时,第三个下拉列表将加载相关项目。

用户可以创建表单并提交。我的 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" })

第一个下拉列表工作正常,但第二个没有。

【问题讨论】:

  • 你有什么问题?当您有视图模型时,为什么要使用ViewBag?当ViewBag 属性已经是SelectList 时,为什么还要在视图中创建第二个SelectList
  • 您可能还想查看this DotNetFiddle 中的代码以实现级联下拉列表。
  • 非常感谢您的建议。我尝试在控制器中使用 viewmodel 而不是 viewbag,并像这样更改了视图页面:
  • ` @Html.DropDownListFor(model => model.Tech_ID, Model.Techniques), new { id = "ddlTechs" })`
  • 但仍然出现同样的错误:DataBinding:“System.Web.Mvc.SelectListItem”不包含名为“Tech_ID”的属性。抱歉,多次提交消息,我不知道按 Enter = 提交评论 ...

标签: c# asp.net asp.net-mvc asp.net-mvc-4 dropdownlistfor


【解决方案1】:

首先,您有一个包含SelectList 属性的视图模型,因此请使用它而不是使用ViewBag 属性。

接下来,删除 SelectList 构造函数中不必要的最后一个参数 (object selectedValue) - 您绑定到模型中的属性,因此它被忽略(在内部,DropDwonListFor() 方法生成一个新的 IEnumerable&lt;SelectListItem&gt; 并设置selectedValue 基于您绑定到的属性的值)

但主要问题是您不必要地生成 3 IEnumerable&lt;SelectListItem&gt;。第一次使用

IEnumerable<SelectListItem> butechs = butechList.Select(...

这是正确的。然后你尝试使用它创建另一个表单

 ViewBag.Techlist = new SelectList(butechs, "Tech_ID", "Tech_Title", form.Tech_ID);

但这一次它会抛出异常,因为butechsIEnumerable&lt;SelectListItem&gt;SelectListItem 不包含属性Tech_IDTech_Title(它需要new SelectList(butechs, "Value", "Text") 以防止错误,但它毫无意义,所以只需删除它)。然后你尝试在DropDownListFor() 方法中创建第三个IEnumerable&lt;SelectListItem&gt;(同样是它毫无意义的额外开销)。

您在控制器中的代码只需

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需要返回视图)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2019-06-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多