6

我正在更新应用程序以使用 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
}

}

4

8 回答 8

5

AFAIK,这不是自动支持的。

您可以编写一个小辅助方法,它采用 Enum 类型并将其转换为List<SelectListItem>如下形式:

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属性,则必须修改它以获取属性值 - 可能通过反射。

于 2013-04-05T17:39:47.417 回答
5

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

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

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

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();
}

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

希望这可以帮助。

于 2013-04-05T17:53:41.700 回答
3

NET MVC 5.1 与@Html.EnumDropDownListFor.

只需.cshtmlViews/EditorTemplate文件夹中新建一个。

例如,在带有网格的 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; }
}

然后你会得到它。

于 2014-05-30T14:26:52.263 回答
2

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

@(Html.Kendo().DropDownList()
    .Name("subscriptionTypeTest")
    .DataTextField("Text")
    .DataValueField("Value")
    .BindTo(Html.GetEnumSelectList(typeof(SubscriptionType)))
    .Deferred()
)
于 2016-06-17T19:41:46.503 回答
2

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

@model Enum

@(Html.Kendo().DropDownListFor(m => m)
        .DataTextField("Text")
        .DataValueField("Value")
        .BindTo(Html.GetEnumSelectList<Web.Models.YourEnumType>())
        
    )
于 2021-07-02T20:28:53.303 回答
1

你可以试试这个

@(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);
}
于 2016-02-24T21:05:13.687 回答
1

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

@(Html.Kendo().DropDownList()
    .Name("subscriptionTypeTest")
    .DataTextField("Text")
    .DataValueField("Value")
    .BindTo(EnumHelper.GetSelectList(typeof(SubscriptionType)))
    .Deferred()
)
于 2016-11-30T17:48:30.593 回答
0

如果您需要 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))
于 2019-11-22T14:16:10.737 回答