【问题标题】:DropDownList with Enum Kendo UI带有 Enum Kendo UI 的 DropDownList
【发布时间】:2013-04-05 17:19:09
【问题描述】:

我正在更新应用程序以使用 Kendo UI,但在使用 DropDownList 绑定到 Enum 时遇到了问题。我遇到的两个问题是 1)该值不包含 Enum 值,而是包含“Today”(应该为 0),以及 2)显示值始终是“Last10Days”而不是“Last 10 Days”在描述中标签。我查看并找不到有人使用 Kendo UI 将描述显示为文本并包含数值而不是文本的另一个地方。任何帮助表示赞赏。

查看

<div class="span6">
  @Html.LabelFor(m=> m.DateRanges)
  @(Html.Kendo().DropDownListFor(m => m.DateRanges)
      .BindTo(Enum.GetNames(typeof(SearchDateRanges)).ToList())
      .HtmlAttributes(new { value = "Today" })
      .DataTextField("Text")
      .Events(e => e.Change("DateChange")))
</div>

<div class="span6">
  @Html.LabelFor(m => m.Status)
  @(Html.Kendo().DropDownListFor(m=> m.Status)
      .BindTo(Enum.GetNames(typeof(SearchStatusCriteria)).ToList())
      .HtmlAttributes(new {value = "All"}))
</div>

型号

    public enum SearchDateRanges
{
    [Description("Today")]
    Today = 0,

    [Description("Last 10 Days")]
    Last10Days = 1,

    /// <summary>
    /// The last 30 days.
    /// </summary>
    [Description("Last 30 Days")]
    Last30Days = 2,

    [Description("Last 60 Days")]
    Last60Days = 3,

    [Description("Last 90 Days")]
    Last90Days = 4,

    [Description("Custom Date Range")]
    CustomRange = 5
}

}

【问题讨论】:

    标签: asp.net-mvc kendo-ui html.dropdownlistfor


    【解决方案1】:

    您似乎在询问枚举的变量名称而不是描述属性:

    .BindTo(Enum.GetNames(typeof(SearchDateRanges)).ToList())
    

    要获得描述属性,您必须做一些工作。这是我找到的一些代码:

    public static string GetEnumDescription(Enum value)
    {
        FieldInfo fi = value.GetType().GetField(value.ToString());
    
    DescriptionAttribute[] attributes =
        (DescriptionAttribute[])fi.GetCustomAttributes(
        typeof(DescriptionAttribute),
        false);
    
    if (attributes != null &&
        attributes.Length > 0)
        return attributes[0].Description;
    else
        return value.ToString();
    }
    

    您还将文本字段绑定到枚举中不存在的“文本”。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,但只绑定枚举值而不是描述。有什么想法吗?
    【解决方案2】:

    AFAIK,这不是自动支持的。

    您可以编写一个小助手方法,它采用 Enum 类型并将其转换为 List&lt;SelectListItem&gt;,如下所示:

    public static List<SelectListItem> EnumToSelectList( Type enumType )
    {
      return Enum
        .GetValues( enumType )
        .Cast<int>()
        .Select( i => new SelectListItem
          {
            Value = i.ToString(),
            Text = Enum.GetName( enumType, i ),
          }
        )
        .ToList()
    }
    

    然后你可以将你的 DropDownList 绑定到选择列表:

    .BindTo( EnumToSelectList( typeof( SearchDateRanges ) ) )
    

    如果您希望文本来自 Description 属性,则必须修改它以获取属性值 - 可能通过反射。

    【讨论】:

    • 谢谢,但只绑定枚举值而不是描述。有什么想法吗?
    【解决方案3】:

    带有@Html.EnumDropDownListFor 的NET MVC 5.1。

    只需在Views/EditorTemplate 文件夹中创建一个新的.cshtml

    例如,在一个带有网格的cshtml中,

    @(Html.Kendo().Grid<NameProved.Models.Issuer>()
    .Name("IssuerGrid")
    .Columns(columns =>
    {
        columns.Bound(issuer => issuer.ID);
        columns.Bound(issuer => issuer.Name);
        columns.Bound(issuer => issuer.IssuerType);
    
        columns.Command(commands =>
            {
                commands.Edit();
                commands.Destroy();
            }).Title("Commands");
    })
    .ToolBar(toolbar => toolbar.Create())
    .Editable(editable => editable
        .Mode(GridEditMode.PopUp)
        )
    .DataSource(datasource =>
        datasource
        .Ajax()
        .Events(events => events.Error("grid_error"))
        .Model(model =>
        {
            model.Id(issuer => issuer.ID);
            model.Field(issuer => issuer.ID).Editable(false).DefaultValue(0);
        })
        .Create(create => create.Action("Issuer_Create", "Admin"))
        .Read(read => read.Action("Issuer_Read", "Admin"))
        .Update(update => update.Action("Issuer_Update", "Admin"))
        .Destroy(destroy => destroy.Action("Issuer_Destory", "Admin"))
        )
    .Pageable()
    
    )
    )
    

    在这里,您必须将UIHint 添加到issuerType,即enum

    然后在Views/Shared/EditorTemplate/IssuerTypeEditor.cshtml

    @model NameProved.Models.IssuerType
    
    @Html.EnumDropDownListFor(issuerType => issuerType)
    

    然后在模型中,添加UIHint

    public class Issuer
    {
    
        public int ID { get; set; }
        public string Name { get; set; }
    
        [UIHint("IssuerTypeEditor")]
        public IssuerType IssuerType { get; set; }
    }
    

    那么你就会得到它。

    【讨论】:

    • 谢谢!通过使编辑器模板的名称与枚举的名称完全相同,我能够避免使用 UIHint。
    【解决方案4】:

    我知道这个帖子很旧,但如果有人用谷歌搜索同样的问题,这里有另一个解决方案:

    @(Html.Kendo().DropDownList()
        .Name("subscriptionTypeTest")
        .DataTextField("Text")
        .DataValueField("Value")
        .BindTo(Html.GetEnumSelectList(typeof(SubscriptionType)))
        .Deferred()
    )
    

    【讨论】:

    • 旁注:如果在编辑器模板中使用它,您可能会遇到 .Deferred() 的问题。我花了几个小时才意识到这是我的问题。
    【解决方案5】:

    这与 Nikolay Kostov 的回答非常相似。这适用于 Telerik asp.net 核心。这是您的编辑器模板的代码。

    @model Enum
    
    @(Html.Kendo().DropDownListFor(m => m)
            .DataTextField("Text")
            .DataValueField("Value")
            .BindTo(Html.GetEnumSelectList<Web.Models.YourEnumType>())
            
        )
    

    【讨论】:

    • 用 .Net5 测试 - 就像一个魅力。至少在 .Net5 中不需要 DataTextField() 和 DataValueField()。 BindTo 尊重由 Html.GetEnumSelectList() 返回的 SelectListItem 枚举。
    【解决方案6】:

    你可以试试这个

    @(Html.Kendo().DropDownListFor(model => model.NoticePeriodType)
          .DataTextField("Text")
          .DataValueField("Value")
          .DataSource(source =>
             {
               source.Read(read =>
               {
                  read.Action("LoadPeriodTypesAjax", "ControllerName"); //put controller name
                });
             })
       )
    
    
    public JsonResult LoadPeriodTypesAjax()
    {
        var values = Enum.GetValues(typeof(PeriodType)).Cast<int>(); //PeriodType= enum name
        var converter = TypeDescriptor.GetConverter(typeof(PeriodType));
        var datas = from value in values
                    select new SelectListItem
                    {
                        Text = converter.ConvertToString(value),
                        Value = value.ToValue(),
                    };
        return Json(datas, JsonRequestBehavior.AllowGet);
    }
    

    【讨论】:

      【解决方案7】:

      Andre 的答案仅适用于 ASP.Net MVC 5.1 及更高版本。 对于旧版本,您可以使用EnumHelper.GetSelectList

      @(Html.Kendo().DropDownList()
          .Name("subscriptionTypeTest")
          .DataTextField("Text")
          .DataValueField("Value")
          .BindTo(EnumHelper.GetSelectList(typeof(SubscriptionType)))
          .Deferred()
      )
      

      【讨论】:

      • 当你说 MVC 5.1 时,你是指 ASP.NET Core MVC 吗?
      • 对于 MVC 5.1,我的意思是 ASP.Net MVC 5.1(我改变了我的答案)。我没有用 ASP.NET Core MVC 测试它。
      【解决方案8】:

      如果您需要 Kendo UI 和 ASP.NET Core 中的枚举编辑器模板,您可以在Enum.cshtml 中使用此编辑器模板代码:

      @model Enum
      @{
          var values = Enum.GetValues(this.ViewData.ModelMetadata.ModelType).Cast<object>()
              .Select(v => new SelectListItem
                           {
                               Selected = v.Equals(this.Model),
                               Text = v.ToString(),
                               Value = ((int)v).ToString()
                           });                               
      }
      
      @(this.Html.Kendo().DropDownListFor(m => m)
          .DataTextField("Text")
          .DataValueField("Value")
          .BindTo(values))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-23
        • 2014-06-14
        相关资源
        最近更新 更多