MVC5 Razor html.dropdownlistfor当数组中的值被选中时被选中

我正在用C#和.NET Framework 4.6.1开发ASP.NET MVC 5应用程序。

我有这个View

 @model MyProject.Web.API.Models.AggregationLevelConfViewModel [...] @Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, (SelectList)Model.HelperCodeTypeItems, new { id = "Configurations[0].HelperCodeType" }) 

ViewModel是:

 public class AggregationLevelConfViewModel { private readonly List<GenericIdNameType> codeTypes; private readonly List<GenericIdNameType> helperCodeTypes; public IEnumerable<SelectListItem> CodeTypeItems { get { return new SelectList(codeTypes, "Id", "Name"); } } public IEnumerable<SelectListItem> HelperCodeTypeItems { get { return new SelectList(helperCodeTypes, "Id", "Name"); } } public int ProductionOrderId { get; set; } public string ProductionOrderName { get; set; } public IList<Models.AggregationLevelConfiguration> Configurations { get; set; } public AggregationLevelConfViewModel() { // Load CodeTypes to show it as a DropDownList byte[] values = (byte[])Enum.GetValues(typeof(CodeTypes)); codeTypes = new List<GenericIdNameType>(); helperCodeTypes = new List<GenericIdNameType>(); for (int i = 0; i < values.Length; i++) { GenericIdNameType cType = new GenericIdNameType() { Id = values[i].ToString(), Name = EnumHelper.GetDescription((CodeTypes)values[i]) }; if (((CodeTypes)values[i]) != CodeTypes.NotUsed) codeTypes.Add(cType); helperCodeTypes.Add(cType); } } } 

Models.AggregationLevelConfiguration是:

 public class AggregationLevelConfiguration { public byte AggregationLevelConfigurationId { get; set; } public int ProductionOrderId { get; set; } public string Name { get; set; } public byte CodeType { get; set; } public byte HelperCodeType { get; set; } public int PkgRatio { get; set; } public int RemainingCodes { get; set; } } 

我需要在这些属性中设置选定的值:

 public IEnumerable<SelectListItem> CodeTypeItems { get { return new SelectList(codeTypes, "Id", "Name"); } } public IEnumerable<SelectListItem> HelperCodeTypeItems { get { return new SelectList(helperCodeTypes, "Id", "Name"); } } 

但是我不能在new SelectList(codeTypes, "Id", "Name");设置它new SelectList(codeTypes, "Id", "Name");new SelectList(helperCodeTypes, "Id", "Name"); 因为选定的值在Configurations数组中:字段AggregationLevelConfiguration.CodeTypeAggregationLevelConfiguration.HelperCodeType

我想我必须在视图中设置选定的值,但我不知道如何去做。

我如何设置选定的值?

不幸的是@Html.DropDownListFor()在循环中呈现控件时的performance与其他帮助器有点不同。 这已经被报告为CodePlex上的一个问题(不知道它是一个错误还是一个限制)

有2个选项来解决这个问题,以确保根据模型属性select正确的选项

选项1 (使用EditorTemplate

为集合中的types创build一个自定义EditorTemplate 。 在/Views/Shared/EditorTemplates/AggregationLevelConfiguration.cshtml创build一个部分(注意名称必须匹配types的名称

 @model yourAssembly.AggregationLevelConfiguration @Html.DropDownListFor(m => m.HelperCodeType, (SelectList)ViewData["CodeTypeItems"]) .... // other properties of AggregationLevelConfiguration 

然后在主视图中,将SelectList作为additionalViewData传递给EditorTemplate

 @using (Html.BeginForm()) { ... @Html.EditorFor(m => m.Configurations , new { CodeTypeItems = Model.CodeTypeItems }) ... 

选项2 (在每次迭代中生成一个新的SelectList并设置selectedValue

在这个选项中,您的属性CodeTypeItems应该是IEnumerable<GenericIdNameType> ,而不是SelectList (或者只是将codeTypes作为公共属性)。 然后在主视图中

 @Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, new SelectList(Model.CodeTypeItems, "Id", "Name", Model.Configurations[0].HelperCodeType) 

注意:不需要使用new { id = "Configurations[0].HelperCodeType"DropDownListFor()方法已经生成了id属性