繁体   English   中英

如何在.NET MVC中以选定值在“编辑”视图中显示动态下拉列表?

[英]How to display dynamic dropdownlists in Edit view with selected values in .NET MVC?

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

用户可以创建表格并提交。 我的CreateController的GET和POST方法效果很好。

现在,我需要EditController来允许用户编辑他的表单。 问题是如何显示带有选定值的第二和第三动态下拉列表?

在我的viewModel中:

    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);

但是这一次它将引发异常,因为butechsIEnumerable<SelectListItem>并且SelectListItem不包含属性Tech_IDTech_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"?

我还建议您研究此DotNetFiddle中的代码, 代码显示了生成级联下拉列表的示例。 特别是private void ConfigureViewModel(ViewModel model)方法中的代码,该方法将根据选定的值生成正确的SelectList ,并且可以从Create()Edit()方法(GET和POST方法Edit()调用该代码。如果您需要返回视图)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM