带有可编辑枚举列的Kendo MVC网格

时间:2015-07-08 14:16:59

标签: c# asp.net kendo-ui kendo-grid kendo-asp.net-mvc

我有一个简单的模型,我需要在Kendo的MVC Grid组件中显示和编辑。

public class MyModel
{
    public int Id {get; set;}
    public string SomeProperty {get; set;}
    public MyEnum MyEnum {get; set;}
}

public enum MyEnum
{
    FirstItem = 1,
    SecondItem = 2,
    ThirdItem = 3
}

我的网格设置如下:

@(Html.Kendo()
    .Grid<MyModel>()
    .Name("grid").Columns(columns =>
    {
        columns.Bound(o => o.SomeProperty).Width(200);
        columns.Bound(o => o.MyEnum).Width(200);
        columns.Command(command =>
        {
            command.Edit().Text("Edit");
        }).Width(220);
    })
    .Editable(editable => editable.Mode(GridEditMode.InLine))
    .DataSource(dataSource => dataSource
        .Ajax()
        .Batch(false)
        .ServerOperation(false)
        .Model(model =>
        {
            model.Id(p => p.Id);
            model.Field(p => p.SomeProperty);
            model.Field(p => p.MyEnum);

        })
        .Create(...) // removed for confidentiality
        .Read(...)
        .Update(...)
        .Events(...)
    ).Filterable()
  .Sortable())

执行编辑命令后,我在Update(...)中定义的控制器方法中接收更新的模型。

public virtual async Task<ActionResult> Update(
        [DataSourceRequest] DataSourceRequest request,
        MyModel myModel)

但无论我做什么,控制器中的myModel默认值为MyEnum。即使我只更改了SomeProperty设置为MyEnum的项目的SecondItem,它也会在控制器中FirstItem。这是通过查看POST请求来验证的,因此问题出现在网格中,而不是服务器上。

如何进行正确的数据绑定以确保Kendo发送正确的MyEnum值?

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。您应该使用EditorTemplate(Shared \ EditorTemplates文件夹中的MyEnum.cshtml)来获取MyEnum属性:

@model MyEnum

@(Html.Kendo().DropDownListFor(m => m)
   .Name("MyEnum")
   .BindTo(EnumHelper.GetSelectList(Model.GetType()))
   .OptionLabel("Please select MyEnum"))

答案 1 :(得分:0)

您的模型中可能存在冲突,因为您的枚举对象属性与该类型匹配。建议你重命名这样的东西,试一试;

public class MyModel
{
    public int Id {get; set;}
    public string SomeProperty {get; set;}
    public MyEnum EnumProperty {get; set;}
}

答案 2 :(得分:0)

您需要在列上使用.ForeignKey()而不是绑定:

@(Html.Kendo()
    .Grid<MyModel>()
    .Name("grid").Columns(columns =>
    {
        columns.ForeignKey(o => o.MyEnum, ).EditorTemplateName("GridForeignKey").Width(200);

        // SNIP

然后在GridForeignKey.cshtml中定义Views/Shared/EditorTemplate,如下所示:

@model object

@{
    var selectList = (SelectList)ViewData[ViewData.TemplateInfo.GetFullHtmlFieldName("") + "_Data"];
}

@Html.DropDownListFor(m => m, selectList, "Choose...")

通过这种方式,您可以在网格中获得一个下拉菜单,并在POST时将正确的值输入控制器。