即使没有更新数据,如何强制 Kendo 网格更新
Posted
技术标签:
【中文标题】即使没有更新数据,如何强制 Kendo 网格更新【英文标题】:How to force a Kendo grid update even when no data is updated 【发布时间】:2013-10-07 13:18:33 【问题描述】:我正在尝试为 Kendo 网格中的产品上传图片(内联编辑)。在插入它工作正常。在更新中,它不允许我只更改图像。单击更新按钮后,除非我更改其他字段之一,否则它不会进入控制器。
因此,如果有办法强制更新按钮转到控制器,那将会很有帮助。
@(html.Kendo().Grid(Model)
.Name("BrandGrid")
.Events(e => e.Edit("edit").DataBound("onDataBound").Cancel("onDataBound"))
.DataSource(dataSource => dataSource
.Ajax()
.ServerOperation(true)
.Events(events => events.Error("error_handler"))
.PageSize(10)
.Model( model =>
model.Id(p => p.BrandID);
model.Field(p => p.BrandID).Editable(false);
)
.Update(update => update.Action("Brand_Update", "Brands"))
.Create(insert => insert.Action("Brand_Insert", "Brands"))
.Read(read => read.Action("Brand_Read", "Brands"))
.Destroy(delete => delete.Action("Brand_Delete", "Brands"))
)
.Columns(columns =>
columns.Bound(p => p.BrandID).Groupable(false).Title(MyResources.LabelBrandID).HeaderHtmlAttributes(new style = "text-align:" + MyResources.HeaderDirection );
columns.Bound(p => p.BrandNameE).Title(MyResources.LabelBrandNameE).HeaderHtmlAttributes(new style = "text-align:" + MyResources.HeaderDirection );
columns.Bound(p => p.BrandNameA).Title(MyResources.LabelBrandNameA).HeaderHtmlAttributes(new style = "text-align:" + MyResources.HeaderDirection );
columns.Bound(p => p.BrandID).Width(120).Title(" ").Filterable(false)
.ClientTemplate(@"<img alt='Brand Image' src='" + Url.Content("~/Images/Brands/") + "#=data.BrandID#.jpg' alt=\"$data.BrandID\" />");
columns.Template(@<text></text>).Title(" ").ClientTemplate("<input type=file name='files' onchange='dataBound(this.value)' />").Width(280).Hidden(true);
columns.Command(command => command.Edit().Text(MyResources.EditText).CancelText(MyResources.CancelText).UpdateText(MyResources.UpdateText); command.Destroy().Text(MyResources.Delete); );
)
.ToolBar(toolbar => toolbar.Create().Text(MyResources.AddNewItem))
.Pageable(pager => pager
.Numeric(true)
.PreviousNext(true)
.Refresh(true)
.PageSizes(true)
)
.Filterable(filterable => filterable
.Extra(true)
.Operators(operators => operators
.ForString(str => str.Clear()
.StartsWith(MyResources.StartsWith)
.IsEqualTo(MyResources.IsEqualTo)
.IsNotEqualTo(MyResources.IsNotEqualTo)
.Contains(MyResources.Contains)
.DoesNotContain(MyResources.DoesNotContain)
.EndsWith(MyResources.EndsWith)
)
.ForNumber(num => num.IsEqualTo(MyResources.IsEqualTo).IsGreaterThan(MyResources.IsGreaterThan).IsNotEqualTo(MyResources.IsNotEqualTo).IsGreaterThanOrEqualTo(MyResources.IsGreaterThanOrEqualto).IsLessThanOrEqualTo(MyResources.IsLessThanOrEqualTo).IsLessThan(MyResources.IsLessThan))
)
.Messages(messages => messages.Info(MyResources.Info).Filter(MyResources.Filter).Clear(MyResources.Clear).And(MyResources.And).Or(MyResources.Or))
)
.Pageable(pager => pager.Messages(messages => messages.Display(MyResources.Display).Empty(MyResources.Empty).First(MyResources.GoToTheFirstPage).Last(MyResources.GoToTheLastPage).Next(MyResources.GoToTheNextPage).Previous(MyResources.GoToThePreviousPage).Of(MyResources.of).Page(MyResources.page).ItemsPerPage(MyResources.ItemsPerPage).Refresh(MyResources.Refresh)))
.Selectable(selectable => selectable
.Mode(GridSelectionMode.Multiple))
.Navigatable()
.Sortable()
.Scrollable(scr => scr.Height(405))
.Resizable(resize => resize.Columns(true))
//.HtmlAttributes(new style = "height:430px;" )
.Editable(editablee => editablee.Mode(GridEditMode.InLine).DisplayDeleteConfirmation(MyResources.DeleteConfirmMessage))
)
【问题讨论】:
分享一些代码让我们看看你在做什么,听起来模型由于某种原因没有改变。 【参考方案1】:Kendo UI 仅在记录为 dirty
时更新记录,这意味着 model 中的某些字段已被修改。
如果你不改变模型而是直接改变数组中的数据,那么KendoUI并不知道记录实际上已经被修改(这就是为什么我们必须使用set
来控制dirty
是否需要切换到true
)。
不确定您如何更改 image 我同意 @PeturSubev 的观点,如果您分享您的代码可能会更容易,因为我们可以看到问题所在。
如果这是不可能的,您可以通过以下方式强制 dataItem 获取 dirty
:
// item is the reference to the data in the Grid DataSource
data.dirty = true;
$("#grid").data("kendoGrid").saveChanges();
此处的示例:http://jsfiddle.net/OnaBai/pPkWc/
【讨论】:
以上是关于即使没有更新数据,如何强制 Kendo 网格更新的主要内容,如果未能解决你的问题,请参考以下文章
更新 ViewModel 时如何防止 Kendo UI Grid 多次重新绑定
Kendo Grid 在创建后不会使用新创建的 id 更新网格