gpt4 book ai didi

enums - 使用 MVC6 Tag Helpers 的 Enum 带有单独标签的单选按钮

转载 作者:行者123 更新时间:2023-12-04 21:37:51 25 4
gpt4 key购买 nike

我的模型包含一个枚举,我试图将其绑定(bind)到单选按钮列表,以便在提交表单时只能选择一个值。

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 中,我将为每个枚举值呈现一个单选按钮输入,并且用户只能选择一个。因此,每个单选按钮的 View 中的代码可能如下所示:
@Html.RadioButtonFor(m => m.SelectedOption, Options.OptionA)

MVC6 的问题似乎是输入标签助手不支持开箱即用的枚举属性。所以如果我尝试添加 <input asp-for="SelectedOption"/> ,我得到的只是一个文本框。

所以我的问题是,有没有办法使用 MVC6 标签助手(开箱即用或自定义)来做到这一点,还是有其他方法可以做到这一点?也许像使用旧的 razor 语法或者只是添加一个输入标签并填充它的属性?

请注意,理想情况下,两个单选按钮都必须有标签,显示枚举的 [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>

ThisEnum.Value001 = Auto Checked radio input..



用于枚举单选按钮列表的 Asp.Net Core TagHelper
/// <summary>
/// <see cref="ITagHelper"/> implementation targeting &lt;enum-radio-button&gt; 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.ModelExplorer,
For.Name,
enum_input_label_name,
htmlAttributes: new { @for = enum_id, @Class = "btn btn-default" });
output.Content.AppendHtml(enum_label);
}
}
}
}

I'm using this style



Html result

关于enums - 使用 MVC6 Tag Helpers 的 Enum 带有单独标签的单选按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33680466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com