6

Kendo UI を使用するようにアプリケーションを更新しようとしていますが、DropDownList を使用して Enum にバインドする際に問題が発生しました。私が抱えている 2 つの問題は、1) 値に Enum 値が含まれておらず、代わりに "Today" が含まれていること (0 である必要があります)、および 2) 表示値が説明の "Last 10 Days" ではなく常に "Last10Days" であることです。鬼ごっこ。誰かが 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

私の知る限り、これは自動的にはサポートされません。

List<SelectListItem>Enum 型を受け取り、次のように変換する小さなヘルパー メソッドを作成できます。

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

description 属性ではなく、列挙型の変数名を要求しているようです。

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

フォルダ.cshtmlに新規作成するだけです。Views/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 に答える
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 に答える
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 に答える