【问题标题】:Using enum for dropdown list in ASP.NET MVC Core在 ASP.NET MVC Core 中使用枚举作为下拉列表
【发布时间】:2017-01-19 11:25:59
【问题描述】:

我正在尝试使用 Razor 视图中的标签助手在 ASP.NET MVC Core 中创建一个带有枚举属性的下拉列表:

这是模型:

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 无法识别并显示为错误。

有人知道怎么解决吗?

【问题讨论】:

  • 尝试指定它... @(Html.GetEnumSelectList())"

标签: c# asp.net asp.net-mvc enums asp.net-core-mvc


【解决方案1】:

我认为您不小心使用了GenderType 而不是Gender。正确的语法是

<select asp-for="GenderType" asp-items="Html.GetEnumSelectList<Gender>()">
    <option selected="selected" value="">Please select</option>
</select>

【讨论】:

  • 这应该是答案,它使用现代标签助手并向您展示如何实现 GetEnumSelectList() 来构建列表项。
  • 第一个在 .net core 中对我有用的建议,谢谢
  • 没有@Html.EnumDropdownFor 方法可以在一行中做到这一点吗?
【解决方案2】:

GenderType 是您的属性名称,而不是 Enum 类型。 GetEnumSelectList 方法希望您为它提供枚举类型,而不是模型中的属性名称。

试试这个:

Html.GetEnumSelectList<Gender>()

【讨论】:

  • 可能需要在 asp-for 中将其标记为元数据,例如:Html.GetEnumSelectList().. OP 没有标记 MVC 框架的版本二手
  • 我试过 Html.GetEnumSelectList() 和 Html.GetEnumSelectList() - 它们都显示为错误
  • 当您使用我上面的示例时,您会遇到什么错误?同一个?我不认为你的第二个例子是有效的语法
  • 在razor中,需要用()包围:@(Html.GetEnumSelectList());因为 razor 将 解释为 html 标签,否则
  • @ADyson 你能看到这个吗? stackoverflow.com/questions/48094102/…
【解决方案3】:

您可以简单地使用 Razor 语法:

@Html.DropDownList("StudentGender", 
    Html.GetEnumSelectList<Gender>(),
    "Select Gender",new { @class = "form-control" })

【讨论】:

  • 这确实是我们需要的!
【解决方案4】:

以下内容对我有用。这是必要的,因为枚举本身是在您用作模型的类的范围内声明的类。

<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】:

    我也遇到了同样的问题,想办法解决!

    您可以解决这种情况,在视图之上实例化您的模型,例如:

    @using CRM.Model;
    

    @using YourSolution.Model

    是的,这听起来太奇怪了,但相信我,它有效!在我自己的帖子中查看我的答案。

    Select ENUM Tag Helper in ASP.NET Core MVC

    【讨论】:

      【解决方案6】:

      DropDownList中有selected选项时,编辑case需要一个case

      在 ASP.NET 5 (MVC 6) Select 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" })
      

      【讨论】:

        【解决方案7】:

        你使用 Gender 来 asp-items="Html.GetEnumSelectList -GenderType- ()" 而不是 GenderType

        如asp-items="Html.GetEnumSelectList -Gender-()"

        【讨论】:

          【解决方案8】:

          这是在netcore 3中使用枚举实现Custom TagHelper DropDownList的方式

           <radio-button-enum asp-for="@Model.Status" value="@Model.Status"></radio-button-enum>
          
          
          /// <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("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);
                      }
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-27
            • 2010-09-28
            • 2017-12-04
            • 1970-01-01
            相关资源
            最近更新 更多