为了账号安全,请及时绑定邮箱和手机立即绑定

当值在数组中时选定的MVC 5 Razor html.Drodown listfor集

当值在数组中时选定的MVC 5 Razor html.Drodown listfor集

尚方宝剑之说 2019-06-13 17:53:32
当值在数组中时选定的MVC 5 Razor html.Drodown listfor集我正在用C#和.NET Framework4.6.1开发ASP.NETMVC 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);         }     }}但我不能把它放进去new SelectList(codeTypes, "Id", "Name");或new SelectList(helperCodeTypes, "Id", "Name");因为所选的值在Configurations数组:字段AggregationLevelConfiguration.CodeType和AggregationLevelConfiguration.HelperCodeType.我想我必须在视图中设置选定的值,但是我不知道如何去做。如何设置选定的值?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

不幸的是@Html.DropDownListFor()在循环中呈现控件时,其行为与其他帮助程序略有不同。这以前曾在CodePlex上被报道为一个问题(不确定它是一个bug还是一个限制)

用于解决此问题的are 2选项,以确保根据模型属性选择正确的选项。

备选案文1(使用EditorTemplate)

创建自定义EditorTemplate用于集合中的类型。创建部分/Views/Shared/EditorTemplates/AggregationLevelConfiguration.cshtml(注意,名称必须与类型的名称匹配。

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

然后在主视图中,传递SelectListEditorTemplateadditionalViewData

@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属性


查看完整回答
反对 回复 2019-06-13
  • 3 回答
  • 0 关注
  • 526 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信