我尝试使用Razor视图中的标记帮助程序在ASP.NET MVC Core中创建一个包含enum属性的下拉列表:
以下是模型:
public class PersonalMember : Member
{
[Required, Display(Name = "First Name")]
public string FirstName { get; set; }
[Required, Display(Name = "Last Name")]
public string LastName { get; set; }
[EnumDataType(typeof(Gender))]
public Gender GenderType { get; set; }
}
public enum Gender
{
Male = 1,
Female = 2
}
以下是视图中表单的一部分:
<div class="form-group">
<label asp-for="GenderType" class="col-md-2 control-label"></label>
<div class="col-md-10">
<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<GenderType>()">
<option selected="selected" value="">Please select</option>
</select>
<span asp-validation-for="GenderType" class="text-danger" />
</div>
</div>
我遇到的问题是在Html.GetEnumSelectList
之后,GenderType
无法识别并显示为错误。
有谁知道如何解决这个问题?
答案 0 :(得分:47)
GenderType
是您的属性名称,而不是Enum类型。 GetEnumSelectList方法要求您为其提供枚举的类型,而不是模型中属性的名称。
试试这个:
Html.GetEnumSelectList<Gender>()
答案 1 :(得分:36)
我认为你不小心使用了GenderType
而不是Gender
。正确的语法是
<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<Gender>()">
<option selected="selected" value="">Please select</option>
</select>
答案 2 :(得分:13)
您只需使用Razor语法:
@Html.DropDownList("StudentGender",
Html.GetEnumSelectList<Gender>(),
"Select Gender",new { @class = "form-control" })
答案 3 :(得分:4)
我遇到了同样的问题,我煞费苦心寻找解决方案!
您可以解决这种情况,在您的视图上实例化模型,如:
@using CRM.Model;
@using YourSolution.Model
是的,这听起来很奇怪但是相信我,它有效!在我自己的帖子上查看我的回答。
答案 4 :(得分:1)
以下是对我有用的。这是必要的,也是这样,因为枚举本身是在您用作模型的类的范围内声明的类。
<select asp-for="Status" class="form-control" asp-items="@Html.GetEnumSelectList<Cart.CartStatus>()"></select>
在我的模型下面(正在进行中)供参考
public class Cart
{
public int CartId { get; set; }
public List<Order> Orders { get; set; }
[Required]
public string UserId { get; set; }
public DateTime DeliveryDate { get; set; }
public CartStatus Status { get; set; }
public enum CartStatus
{
Open = 1,
Confirmed = 2,
Shipped = 3,
Received = 4
}
}
答案 5 :(得分:1)
在DropDownList中选择选项时,需要一种情况来进行编辑。
在ASP.NET 5(MVC 6)中使用枚举选择TagHelper
public enum Gender {
[Display(Name = "Male")]Male = 1,
[Display(Name = "Female N")]Female = 2,
[Display(Name = "Other")]Other = 3
}
**对于编辑案例:
@Html.DropDownListFor(m => m, Html.GetEnumSelectList(typeof(Gender)))
@Html.DropDownListFor(m => m.Gender, Html.GetEnumSelectList<Gender>()))
@Html.DropDownListFor(m => m.Gender, Html.GetEnumSelectList<Gender>(), "Select", new { @class = "form-control" })
**对于正常情况:
<select asp-for="Gender" asp-items="@Html.GetEnumSelectList<Gender>()">
<option selected="selected" value="">Please select</option>
</select>
<select asp-for="Gender" asp-items="ViewBag.Genders"></select>
@Html.DropDownList("Gender", Html.GetEnumSelectList<Gender>(), "Select", new { @class = "form-control" })
答案 6 :(得分:0)
您将Gender用作asp-items =“ Html.GetEnumSelectList -GenderType-()”而不是GenderType
例如asp-items =“ Html.GetEnumSelectList -Gender-()”
答案 7 :(得分:0)
这是在netcore 3中使用枚举实现自定义TagHelper DropDownList的方法
<radio-button-enum asp-for="@Model.Status" value="@Model.Status"></radio-button-enum>
/// <summary>
/// <see cref="ITagHelper"/> implementation targeting <enum-radio-button> elements with an <c>asp-for</c> attribute, <c>value</c> attribute.
/// </summary>
[HtmlTargetElement("radio-button-enum", 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)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
if (output == null)
{
throw new ArgumentNullException(nameof(output));
}
var childContent = await output.GetChildContentAsync().ConfigureAwait(true);
string innerContent = childContent.GetContent();
output.Content.AppendHtml(innerContent);
output.TagName = "div";
output.TagMode = TagMode.StartTagAndEndTag;
output.Attributes.Add("class", "btn-group btn-group-radio");
var modelExplorer = For?.ModelExplorer;
var metaData = For?.Metadata;
if (metaData?.EnumNamesAndValues != null)
{
foreach (var item in metaData.EnumNamesAndValues)
{
string enumId = $"{metaData.ContainerType.Name}_{metaData.PropertyName}_{item.Key}";
string enumInputLabelName = item.Key.ToString();
bool enumIsChecked = false;
if (Value != null)
{
if (enumInputLabelName == Value.ToString())
{
enumIsChecked = true; }
}
else
{
if (For.Model != null && enumInputLabelName == For.Model.ToString())
{
enumIsChecked = true;
}
}
var enumResourcedName = metaData.EnumGroupedDisplayNamesAndValues.FirstOrDefault(x => x.Value == item.Value);
if (enumResourcedName.Value != null)
{
enumInputLabelName = enumResourcedName.Key.Name;
}
var enumRadio = Generator.GenerateRadioButton(
ViewContext,
For.ModelExplorer,
metaData.PropertyName,
item.Key,
false,
htmlAttributes: new { @id = enumId });
enumRadio.Attributes.Remove("checked");
if (enumIsChecked)
{
enumRadio.MergeAttribute("checked", "checked");
}
output.Content.AppendHtml(enumRadio);
var enumLabel = Generator.GenerateLabel(
ViewContext,
For.ModelExplorer,
For.Name,
enumInputLabelName,
htmlAttributes: new { @for = enumId, @Class = "btn btn-default" });
output.Content.AppendHtml(enumLabel);
}
}
}
}