枚举 – 使用MVC6标记助手为Enum添加单个标签的单选按钮
发布时间:2020-12-16 09:41:47 所属栏目:asp.Net 来源:网络整理
导读:我的模型包含一个枚举,我正在尝试绑定到一个单选按钮列表,这样在提交表单时只能选择一个值. public enum Options{ [Display(Name="Option A") OptionA,[Display(Name="Option B") OptionB}public class MyModel{ public Options SelectedOption {get; set;}
我的模型包含一个枚举,我正在尝试绑定到一个单选按钮列表,这样在提交表单时只能选择一个值.
public enum Options { [Display(Name="Option A") OptionA,[Display(Name="Option B") OptionB } public class MyModel { public Options SelectedOption {get; set;} public string TextA{get; set;} public string TextB{get; set;} } 在MVC 5中,我将为每个枚举值渲染一个单选按钮输入,用户只能选择一个.因此,每个单选按钮的视图中的代码可能如下所示: @Html.RadioButtonFor(m => m.SelectedOption,Options.OptionA) MVC6的问题似乎是输入标记帮助器不支持开箱即用的枚举属性.因此,如果我尝试添加< input asp-for =“SelectedOption”/>,我得到的只是一个文本框. 所以我的问题是,有没有办法使用MVC6标签帮助程序(开箱即用或自定义)或是否有另一种方法来做到这一点?也许类似于使用旧的剃刀语法或只是添加输入标签并填充其属性? 请注意,理想情况下,两个单选按钮都必须有标签,以显示枚举[Display]属性中指定的文本.此外,只有一个TextA或TextB文本框可以同时出现,这应该基于所选的单选按钮,但这超出了问题的范围.所以这里是渲染标记的样子(或多或少): <div> <div> <input id="OptionA" type="radio" name="SelectedOption"/> <label for="OptionA">Option A</label> </div> <div> <label for="TextA">Text A</label> <input type="text" id="TextA" name="TextA"> </div> <div> <div> <div> <input id="OptionB" type="radio" name="SelectedOption"/> <label for="OptionB">Option B</label> </div> <div> <label for="TextB">Text A</label> <input type="text" id="TextB" name="TextB"> </div> <div> 解决方法<enum-radio-button asp-for="ThisEnum"></enum-radio-button> <enum-radio-button asp-for="ThisEnum" value="ThisEnum.Value001"></enum-radio-button>
用于枚举单选按钮列表的Asp.Net Core TagHelper /// <summary> /// <see cref="ITagHelper"/> implementation targeting <enum-radio-button> elements with an <c>asp-for</c> attribute,<c>value</c> attribute. /// </summary> [HtmlTargetElement("enum-radio-button",Attributes = RadioButtonEnumForAttributeName)] public class RadioButtonEnumTagHelper : TagHelper { private const string RadioButtonEnumForAttributeName = "asp-for"; private const string RadioButtonEnumValueAttributeName = "value"; /// <summary> /// Creates a new <see cref="RadioButtonEnumTagHelper"/>. /// </summary> /// <param name="generator">The <see cref="IHtmlGenerator"/>.</param> public RadioButtonEnumTagHelper(IHtmlGenerator generator) { Generator = generator; } /// <inheritdoc /> public override int Order => -1000; [HtmlAttributeNotBound] [ViewContext] public ViewContext ViewContext { get; set; } protected IHtmlGenerator Generator { get; } /// <summary> /// An expression to be evaluated against the current model. /// </summary> [HtmlAttributeName(RadioButtonEnumForAttributeName)] public ModelExpression For { get; set; } [HtmlAttributeName(RadioButtonEnumValueAttributeName)] public Enum value { get; set; } /// <inheritdoc /> /// <remarks>Does nothing if <see cref="For"/> is <c>null</c>.</remarks> public override async Task ProcessAsync(TagHelperContext context,TagHelperOutput output) { var childContent = await output.GetChildContentAsync(); string innerContent = childContent.GetContent(); output.Content.AppendHtml(innerContent); output.TagName = "div"; output.TagMode = TagMode.StartTagAndEndTag; output.Attributes.Add("class","btn-group btn-group-radio"); if (context == null) { throw new ArgumentNullException(nameof(context)); } if (output == null) { throw new ArgumentNullException(nameof(output)); } var modelExplorer = For.ModelExplorer; var metaData = For.Metadata; if (metaData.EnumNamesAndValues != null) { foreach (var item in metaData.EnumNamesAndValues) { string enum_id = $"{metaData.ContainerType.Name}_{metaData.PropertyName}_{item.Key}"; bool enum_ischecked = false; if (value != null) { if (value != null && item.Key.ToString() == value.ToString()) { enum_ischecked = true; } } else { if (For.Model != null && item.Key.ToString() == For.Model.ToString()) { enum_ischecked = true; } } string enum_input_label_name = item.Key; var enum_resourced_name = metaData.EnumGroupedDisplayNamesAndValues.Where(x => x.Value == item.Value).FirstOrDefault(); if (enum_resourced_name.Value != null) { enum_input_label_name = enum_resourced_name.Key.Name; } var enum_radio = Generator.GenerateRadioButton( ViewContext,For.ModelExplorer,metaData.PropertyName,item.Key,false,htmlAttributes: new { @id = enum_id }); enum_radio.Attributes.Remove("checked"); if (enum_ischecked) { enum_radio.MergeAttribute("checked","checked"); } output.Content.AppendHtml(enum_radio); var enum_label = Generator.GenerateLabel( ViewContext,For.Name,enum_input_label_name,htmlAttributes: new { @for = enum_id,@Class = "btn btn-default" }); output.Content.AppendHtml(enum_label); } } } }
Html result (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ASP.NET MVC在IIS6上
- asp.net-mvc – 使用ASP.NET MVC的Telerik控件:这是否违反
- asp.net-mvc-3 – MVC 3 – 其他视图数据未出现在编辑器中用
- asp.net – Entity Framework v2不支持sql 2000吗?
- asp.net-web-api – web api – asp.net身份令牌即使对于后
- asp.net-mvc – 为什么这两个API方法会产生冲突
- .net – 为什么我的剃刀视图抱怨“}预计”升级到剃刀2/mvc
- asp.net MVC下使用rest的方法
- asp.net-mvc – 如何在ASP.NET MVC中执行[RequireHttps(Red
- asp.net-core – 将命名空间添加到ASP.NET MVC 6中的所有视
推荐文章
站长推荐
- asp.net-mvc-3 – 在asp.net MVC 3中使用WIF,我在
- 我应该使用用户名,还是用户ID来引用ASP.NET中的经
- .NET MVC屏蔽密码文本框
- asp.net – 如何手动调用ValidationAttributes?
- asp.net-mvc-3 – 显示模型中外键属性的显示值
- asp.net-mvc – 如何与NopCommerce MVC合作
- asp.net-mvc – ASP.NET MVC 4“DictionaryValue
- ASP.NET MVC中的经典ASP(C#)
- 为ASP.Net AJAX String.format方法创建TypeScrip
- asp.net-mvc – 将Linq2Sql对象传递给Views有什么
热点阅读