Exclude/RemoveValuesfromMVC5.1EnumDropDownListFor我有一个用户管理页面的枚举列表。我在MVC5.1中使用新的HtmlHelper,它允许我为枚举值创建下拉列表。我现在需要从列表中删除Pending值,该值只能以编程方式设置,用户绝不能设置。Enum:publicenumUserStatus{Pending=0,Limited=1,Active=2}View:@Html.EnumDropDownListFor(model=>model.Status)无论如何,要么覆盖当前控件,要么编写一个允许我指定枚举自定义的控件HtmlHelper,或从结果列表中排除枚举?或者你会建议我用jQuery在客户端做一些事情,一旦生成就从下拉列表中删除值吗?谢谢!您可以构建一个下拉列表:@{//您可以将以下内容放入后端方法并通过ViewBagvarselectList=Enum.GetValues(typeof(UserStatus)).Cast().Where(e=>e!=UserStatus.Pending).Select(e=>newSelectListItem{Value=((int)e).ToString(),Text=e.ToString()});@Html.DropDownListFor(m=>m.Status,selectList)根据@dav_i的回答修改。它并不完美,但它是我使用的。以下是HtmlHelper的扩展。扩展方法看起来像ASP.NET中的EnumDropDownListFor,如果有任何应用于枚举值,则带有DisplayAttribute。//////为枚举中的每个值返回一个HTML选择元素,///由指定的表达式和谓词表示。//////模型的类型。///值的类型。///此方法扩展的HTML帮助程序实例。///标识包含要显示的属性的对象的表达式。///默认空项目的文本。此参数可以为空。///A过滤枚举中的项目。///包含要为元素设置的HTML属性的对象。///由表达式和谓词表示的枚举中每个值的HTML选择元素。///如果表达式为空。///如果TEnum不是枚举类型。publicstaticMvcHtmlStringEnumDropDownListFor(thisHtmlHelperhtmlHelper,Expression>expression,Funcpredicate,stringoptionLabel,objecthtmlAttributes)其中TEnum:struct,IConvertible{if(expression==null){thrownewArgumentNullException("expression");}if(!typeof(TEnum).IsEnum){thrownewArgumentException("TEnum");}ModelMetadata元数据=ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData);IListselectList=Enum.GetValues(typeof(TEnum)).Cast().Where(e=>predicate(e)).Select(e=>newSelectListItem{Value=Convert.ToUInt64(e).ToString(),Text=((Enum)(object)e).GetDisplayName(),}).ToList();如果(!string.IsNullOrEmpty(optionLabel)){selectList.Insert(0,newSelectListItem{Text=optionLabel,});}returnhtmlHelper.DropDownListFor(expression,selectList,htmlAttributes);}//////获取Enum中的名称。//////方法扩展到的A。///Enum中的名称字符串。publicstaticstringGetDisplayName(thisEnumenumeration){TypeenumType=enumeration.GetType();stringenumName=Enum.GetName(enumType,enumeration);stringdisplayName=enumName;try{MemberInfomember=enumType.GetMember(enumName)[0];object[]属性=member.GetCustomAttributes(typeof(DisplayAttribute),false);DisplayAttribute属性=(DisplayAttribute)attributes[0];显示名称=属性.名称;if(attribute.ResourceType!=null){displayName=attribute.GetName();}}catch{}返回显示名称;}例如:@Html.EnumDropDownListFor(model=>model.UserStatus,(userStatus)=>{returnuserStatus!=UserStatus.Active;},null,htmlAttributes:new{@class="form-control"});这将创建一个没有活动选项的枚举下拉列表。您可以通过遍历枚举中的值来自己创建下拉列表,并且仅在它不是Pending时才包含。下面是它应该如何工作,但如您所见,我不确定您将使用哪个选项标签的值或文本。foreach(varstatusinEnum.GetValues(typeof(UserStatus))){if(status!=UserStatus.Pending){@status.???下面是HtmlHelper的扩展。它与ASP.NET中的EnumDropDownListFor扩展非常相似,但它按项目显示名称对SelectListItem进行排序。它有一个暗示性的名称:SortedEnumDropDownListFor,以免与原始扩展冲突。////////////模型的类型。///值的类型。///此方法扩展的HTML帮助程序实例。///标识包含要显示的属性的对象的表达式///未选择的项目初始值//////publicstaticMvcHtmlStringSortedEnumDropDownListFor(thisHtmlHelperhtmlHelper,Expression>expression,stringinitalValue,objecthtmlAttributes=null){ModelMetadata元数据=ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData);输入enumType=GetNonNullableModelType(元数据);类型baseEnumType=Enum.GetUnderlyingType(enumType);列表项=newList();foreach(FieldInfofieldinenumType.GetFields(BindingFlags.Static|BindingFlags.GetField|BindingFlags.Public)){stringtext=field.Name;字符串值=Convert.ChangeType(field.GetValue(null),baseEnumType).ToString();boolselected=field.GetValue(null).Equals(metadata.Model);foreach(DisplayAttribute显示字段中的属性。GetCustomAttributes(true).OfType()){text=displayAttribute.GetName();}items.Add(newSelectListItem{Text=text,Value=value,Selected=selected});}items=newList(items.OrderBy(s=>s.Text));items.Insert(0,newSelectListItem{Text=initalValue,Value=""});返回htmlHelper.DropDownListFor(表达式,项目,htmlAttributes);}privatestaticTypeGetNonNullableModelType(ModelMetadatamodelMetadata){TyperealModelType=modelMetadata.ModelType;输入underlyingType=Nullable.GetUnderlyingType(realModelType);if(underlyingType!=null){realModelType=underlyingType;}返回真实模型类型;如果你不想打扰未选择的项目intitia,只需要像这样构建一个重载:,string.Empty,htmlAttributes);归还你的帮手;很高兴我希望它有所帮助。以上是C#学习教程:Exclude/deletevaluesharingfromMVC5.1EnumDropDownListFor。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
