在ASP.NET Core MVC中选择ENUM标记帮助器

Rog*_*edo 3 asp.net-mvc enums asp.net-core asp.net-core-tag-helpers

我需要使用Tag Helper进行ENUM下拉菜单的帮助。

我发现很多示例都将模型绑定到Selectlist,有些示例使用ENUM,但所有示例都涉及CREATE操作,而Im面临EDIT操作的问题。

我的模型

 public class ProspectLog
    {
        public int Id { get; set; }
        public int IdProspect { get; set; }
        public int IdEmpresa { get; set; }
        public DateTime Criado { get; set; }
        public string Usuario { get; set; }
        public string Descricao { get; set; }

        public ETipoLog TipoLog { get; set; }

        public enum ETipoLog
        {
            [Display(Name = "CADASTRO")]
            Cadastro = 0,
            [Display(Name = "CONTATO")]
            Contato = 1,
            [Display(Name = @"TROCA ETAPA")]
            Troca = 2,
            [Display(Name = @"QUALIFICAÇÃO")]
            Qualifica = 3,
            [Display(Name = @"EDIÇÃO")]
            Edicao = 4
        }
    }
Run Code Online (Sandbox Code Playgroud)

在基于MVC5的旧项目中,我只是在View上使用了它就足够了。

落下

<div class="form-group col-sm-6">
   <label style="font-weight: bolder" for="txtSituacao">Situação</label>
   @Html.EnumDropDownListFor(model => model.Situacao, htmlAttributes: new { @class = "form-control" })
   @Html.ValidationMessageFor(model => model.Situacao, "", new { @class = "text-danger" })
</div>
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的方式,并且对在编辑操作中选择的数据库项设置了下拉菜单。我这样尝试:

<div class="form-group">
    <label asp-for="TipoLog" class="col-md-2 control-label"></label>
    <div class="col-md-10">             
         <select asp-for="TipoLog" class="form-control"></select>
         <span asp-validation-for="TipoLog" class="text-danger"></span>
     </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我也这样尝试过:

 <div class="form-group">
     <label asp-for="TipoLog" class="col-md-2 control-label"></label>
     <div class="col-md-10"> 
          <select asp-for="TipoLog" asp-items="Html.GetEnumSelectList<TipoLog>()"></select>
           <span asp-validation-for="TipoLog" class="text-danger"></span>
      </div>
</div>
Run Code Online (Sandbox Code Playgroud)

但这让我遇到了编译错误: 在此处输入图片说明

我还尝试通过以下方式将模型列表绑定到控制器上的ViewBag:

控制器:

ViewBag.Log = new SelectList(lista, "Id", "Nome");
Run Code Online (Sandbox Code Playgroud)

视图:

 <div class="form-group col-sm-2">
      <label asp-for="TipoLogo" class="col-md-2 control-label"></label>
      <select asp-for="TipoLogo" asp-items="ViewBag.Log" class="form-control"></select>
       <span asp-validation-for="TipoLogo" class="text-danger"></span>
</div>
Run Code Online (Sandbox Code Playgroud)

它的部分工作,下拉列表中列出了项目,但没有从数据库中选择正确的项目。它在列表中显示所选的第一个。

Rog*_*edo 7

终于我找到了解决方案!

这似乎并不明显,但是那样我就没有编译错误。我从Ivan那里得到的答案是不正确的,但是有必要CRM.Model像这样导入视图中的:

@using CRM.Model;
Run Code Online (Sandbox Code Playgroud)

因此,我的下拉列表:

<select asp-for="TipoLog" asp-items="Html.GetEnumSelectList<ETipoLog>()" class="form-control"></select>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您可以看到,Visual Studio告诉我它不是必需的,用灰色绘制它,但是如果不这样做,我会得到编译错误。我希望我能帮助别人。


Mar*_*osa 6

您忘记了使用“ @”在HTML中转义C#代码。

尝试:

<select asp-for="TipoLog" asp-items="Html.GetEnumSelectList<TipoLog>()"></select>
Run Code Online (Sandbox Code Playgroud)

更新为在Html.Get之前删除@。