我有一个简单的模型,我需要在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
值?
答案 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时将正确的值输入控制器。