在ASP.NET Core MVC中选择ENUM标签助手

6
我是一个有用的助手,可以为您翻译文本。

我需要使用标签助手(Tag Helper)来帮助下拉菜单中的枚举(ENUM)。

我找到了很多绑定模型到Selectlist的例子和一些使用ENUM的例子,但所有这些例子都只涉及到CREATE操作,而我在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
        }
    }

在基于MVC5的旧项目中,我只是在视图中使用了这个代码,就足够了。

下拉菜单

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

我尝试了各种方法,但在编辑操作中无法设置下拉菜单与数据库项目选择。我尝试了以下方式:

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

我也试过这样做:
 <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>

但是它导致了一个编译错误:enter image description here

我还尝试在控制器上将模型列表绑定到ViewBag,方式如下:

控制器:

ViewBag.Log = new SelectList(lista, "Id", "Nome");

查看:

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

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


我还发现了这个教程:http://www.jerriepelser.com/blog/using-enum-aspnet-5-select-taghelper/ 但就像我上面提到的,它运行时出现了异常,我无法解决这个问题。 - Rogerio Azevedo
4个回答

13

最终我找到了解决方案!

这个方法并不显而易见,但是这样我就没有编译错误了!!!Ivan 给我的答案并没有错,但在视图中还需要导入CRM.Model

@using CRM.Model;
所以,我的下拉菜单:
<select asp-for="TipoLog" asp-items="Html.GetEnumSelectList<ETipoLog>()" class="form-control"></select>

在此输入图片描述

你可以看到,Visual Studio告诉我这是不必要的,将其涂成灰色,但如果没有它,我会得到编译错误。我希望能帮助其他人。


6

您忘记在HTML中使用"@"来转义C#代码了

尝试如下:

<select asp-for="TipoLog" asp-items="Html.GetEnumSelectList<TipoLog>()"></select>

更新以删除Html.Get之前的@符号...


嘿,马丁,标签助手不使用你建议的@符号。无论如何,感谢您的回答。 - Rogerio Azevedo

4

这对我有用,不需要using声明。

(注:该段文字已经是中文,无需翻译)
<select asp-for="ClientFeeStage"
   asp-items="@Html.GetEnumSelectList(typeof(AT.Domain.Entities.ClientFeeStage))"
   class="form-control">

这篇文章中的其他方法对我没有用,但是你的方法有效。谢谢! - thesystem

3
尝试使用以下代码:<select asp-for="TipoLog" asp-items="Html.GetEnumSelectList<ETipoLog>()"></select>

嗨,伊万,谢谢你的回答。我已经尝试过了,但是我得到了相同的编译错误。 - Rogerio Azevedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接