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.CodeType
和AggregationLevelConfiguration.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
属性
- 在Asp.Net MVC 5中获取login用户的用户名
- 获取“JSON请求太大,无法反序列化”
- Html.Hidden和Html.HiddenFor有什么区别?
- “System.Web.Mvc.MvcWebRazorHostFactory”types的expression式不能用于返回types“System.Web.WebPages.Razor.WebRazorHostFactory”
- 你可以重载ASP.NET MVC中的控制器方法?
- testing方法不确定:testing未运行。 错误?
- 用EF4“Code First”和Repository进行unit testing
- C#ASP.NET MVC返回上一页
- 在asp.net mvc视图模型中的默认值