MVC Kendo 可编辑网格不保存枚举值
MVC Kendo Editable Grid not saving Enum value
我目前正在创建我的第一个 Kendo 网格。几乎一切正常,除了我的 Status
枚举和 Code
(基本上是一个 id)没有在 Create
操作上传递到我的控制器。
这是我的 Kendo 网格(重要的部分)-
@(Html.Kendo().Grid<MyViewModel>()
.Name("grid")
.AutoBind(false)
.HtmlAttributes(new { @class = "grid-clickable-edit" })
.Columns(columns =>
{
columns.Command(command =>
{
command.Edit().IconClass("fas fa-pencil").UpdateIconClass("fas fa-check").CancelIconClass("fas fa-ban");
command.Destroy().IconClass("fas fa-trash");
})
.ClientHeaderTemplate(Html.GridAddButton())
.Width(180);
//some fields
columns.Bound(model => model.Code)
.EditorTemplateName("GridDropdownEditor")
.EditorViewData(new {data = ViewBag.CodeList})
.ClientTemplate("#:Code#");
//some other fields
columns.Bound(model => model.StatusId)
.EditorTemplateName("StatusEditor");
.ClientTemplate("#:StatusName#");
//more fields
})
.Pageable(pg => pg.Numeric(false).PreviousNext(false))
.Sortable()
.Scrollable(scroll => scroll.Virtual(true))
.Filterable(x => x.Enabled(false))
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(true)
.Model(model => { model.Id(m => m.Id); })
.Read(...)
.Create(update => update.Action(...))
.Update(update => update.Action(...))
.Destroy(update => update.Action(...))
))
ViewBag.CodeList 是每个代码的 Id 列表,以及描述。下拉列表基本上显示了连接在一起的 id 和描述。
网格下拉编辑器 -
@model object
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("Text")
.DataValueField("Value")
.BindTo((IEnumerable<SelectListItem>)ViewData["data"])
)
状态编辑器 -
@using MyProject.Data.Models
@using MyProject.Helpers
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("Text")
.DataValueField("Value")
.BindTo(EnumHelper<BidStatus>.ToSelectList())
)
)
EnumHelper.ToSelectList()
方法基本上从我的 Status
枚举中获取字符串和 Id 值,然后将其放入 SelectList
状态枚举 -
public enum Status
{
Status1 = 1,
Status2 = 2,
Status3 = 3
}
MyViewModel(同样重要的部分)-
public int? Code { get; set; }
public Status? StatusId { get; set; }
public string StatusName
{
get { return StatusId.ToString(); }
}
Status 和 Code 的下拉列表填充得很好,但它们实际上从未被网格拾取并传递给控制器。仅供参考 - 代码和状态字段必须可以为空。如果需要更多信息,请告诉我,我很乐意提供。
我试过的
我尝试使用此处的解决方案 - ,但对我不起作用。
我认为出现此问题是因为下拉列表绑定到对象集合,因此,在服务器上,绑定器无法将提交的对象映射到枚举值。
您可以尝试将下拉菜单的 ValuePrimitive 设置为 true,这样只会将值字段(Value)提交给服务器,而不是整个对象。
例如
@using MyProject.Data.Models
@using MyProject.Helpers
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("Text")
.DataValueField("Value")
.ValuePrimitive(true)
.BindTo(EnumHelper<BidStatus>.ToSelectList())
)
)
对两个下拉菜单执行相同的操作。
我目前正在创建我的第一个 Kendo 网格。几乎一切正常,除了我的 Status
枚举和 Code
(基本上是一个 id)没有在 Create
操作上传递到我的控制器。
这是我的 Kendo 网格(重要的部分)-
@(Html.Kendo().Grid<MyViewModel>()
.Name("grid")
.AutoBind(false)
.HtmlAttributes(new { @class = "grid-clickable-edit" })
.Columns(columns =>
{
columns.Command(command =>
{
command.Edit().IconClass("fas fa-pencil").UpdateIconClass("fas fa-check").CancelIconClass("fas fa-ban");
command.Destroy().IconClass("fas fa-trash");
})
.ClientHeaderTemplate(Html.GridAddButton())
.Width(180);
//some fields
columns.Bound(model => model.Code)
.EditorTemplateName("GridDropdownEditor")
.EditorViewData(new {data = ViewBag.CodeList})
.ClientTemplate("#:Code#");
//some other fields
columns.Bound(model => model.StatusId)
.EditorTemplateName("StatusEditor");
.ClientTemplate("#:StatusName#");
//more fields
})
.Pageable(pg => pg.Numeric(false).PreviousNext(false))
.Sortable()
.Scrollable(scroll => scroll.Virtual(true))
.Filterable(x => x.Enabled(false))
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.Batch(true)
.ServerOperation(true)
.Model(model => { model.Id(m => m.Id); })
.Read(...)
.Create(update => update.Action(...))
.Update(update => update.Action(...))
.Destroy(update => update.Action(...))
))
ViewBag.CodeList 是每个代码的 Id 列表,以及描述。下拉列表基本上显示了连接在一起的 id 和描述。
网格下拉编辑器 -
@model object
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("Text")
.DataValueField("Value")
.BindTo((IEnumerable<SelectListItem>)ViewData["data"])
)
状态编辑器 -
@using MyProject.Data.Models
@using MyProject.Helpers
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("Text")
.DataValueField("Value")
.BindTo(EnumHelper<BidStatus>.ToSelectList())
)
)
EnumHelper.ToSelectList()
方法基本上从我的 Status
枚举中获取字符串和 Id 值,然后将其放入 SelectList
状态枚举 -
public enum Status
{
Status1 = 1,
Status2 = 2,
Status3 = 3
}
MyViewModel(同样重要的部分)-
public int? Code { get; set; }
public Status? StatusId { get; set; }
public string StatusName
{
get { return StatusId.ToString(); }
}
Status 和 Code 的下拉列表填充得很好,但它们实际上从未被网格拾取并传递给控制器。仅供参考 - 代码和状态字段必须可以为空。如果需要更多信息,请告诉我,我很乐意提供。
我试过的
我尝试使用此处的解决方案 -
我认为出现此问题是因为下拉列表绑定到对象集合,因此,在服务器上,绑定器无法将提交的对象映射到枚举值。
您可以尝试将下拉菜单的 ValuePrimitive 设置为 true,这样只会将值字段(Value)提交给服务器,而不是整个对象。
例如
@using MyProject.Data.Models
@using MyProject.Helpers
@(Html.Kendo().DropDownListFor(m => m)
.DataTextField("Text")
.DataValueField("Value")
.ValuePrimitive(true)
.BindTo(EnumHelper<BidStatus>.ToSelectList())
)
)
对两个下拉菜单执行相同的操作。