2

我正在使用带有 MVC 4 的 Kendo UI Grid,它运行良好,只有一个例外。

如果我在网格中添加一行,然后更新一行,它最终会添加一行而不是更新它。

我能说的是,如果我按添加,程序会在我的 MVC 控制器中输入Create方法,如果我在添加连续按更新,我会再次输入Create方法。

但是,如果我只是在启动后直接按下网格中的更新按钮,情况似乎并非如此。我正在使用 Ajax 调用来完成所有这些操作,因此它与页面在调用之间不更新有关。如果我只执行一个命令然后刷新页面,一切都会很好。我也使用实体框架作为 ORM。

这是我的剃刀观点:

@model IEnumerable<Internal.License.Management.Web.UI.Models.PriceListViewModel>

@{
   ViewBag.Title = "Price List";
}

@(Html.Kendo().Grid<Internal.License.Management.Web.UI.Models.PriceListViewModel>()
.Name("grid")
.Columns(columns =>
    {
        columns.Bound(p => p.Name).Width(120);
        columns.Bound(p => p.Code).Width(180);
        columns.Bound(p => p.Interval).Width(180);
        columns.Bound(p => p.PricePerUnit).Width(200);
        columns.Bound(p => p.Currency).Width(120);
        columns.Command(commands =>
            {
                commands.Edit();
                commands.Destroy();
            }).Width(172);
    })
.ToolBar(toolbar => toolbar.Create())
.Editable(editable => editable.Mode(GridEditMode.InLine))
.Pageable()
.Sortable()
.Scrollable()
.HtmlAttributes(new { style = "height:430px;" })
.DataSource(dataSource =>
    dataSource.Ajax()
    .PageSize(20)
    .Events(events => events.Error("error_handler"))
    .Model(model => model.Id(p => p.Id))
    .Create(create => create.Action("Create", "PriceList"))
        .Read(read => read.Action("Read", "PriceList"))
        .Update(update => update.Action("Update", "PriceList"))
        .Destroy(destroy => destroy.Action("Delete", "PriceList"))
  ))

这是我的控制器:

public class PriceListController : Controller
{
    public ActionResult List()
    {
        return View("PriceList");
    }

    public ActionResult Read([DataSourceRequest] DataSourceRequest request)
    {
        var model = new DataAdapter().GetAllOptionTemplates();
        var result = model.ToDataSourceResult(request);

        return Json(result);
    }

    [HttpPost]
    public ActionResult Create([DataSourceRequest] DataSourceRequest request,  
                           PriceListViewModel model)
    {
        if (model != null && ModelState.IsValid)
        {
           new DataAdapter().SaveToDatabase(model);
        }

        return Json(new[] { model }.ToDataSourceResult(request, ModelState));
    }

    [HttpPost]
    public ActionResult Update([DataSourceRequest] DataSourceRequest request,   
                           PriceListViewModel model)
    {
        if (model != null && ModelState.IsValid)
        {
           new DataAdapter().UpdateToDatabase(model);
        }

        return Json(ModelState.ToDataSourceResult());
    } 
}

这是我的视图模型

public class PriceListViewModel
{
    public int Id { get; set; }
    public string Currency { get; set; }
    [DisplayName("Option Name")]
    public string Name { get; set; }
    public string Code { get; set; }
    public string Interval { get; set; }
    public decimal PricePerUnit { get; set; }
}
4

6 回答 6

5

我记得以前遇到过这个问题,但我找不到如何解决它。

将模型保存到数据库后,在从方法中返回它之前,请确保它具有它的 ID。(调试并观察model对象)。如果没有,您可以尝试以下方法:

model.Id = saveditem.Id;
return Json(new[] { model }.ToDataSourceResult(request, ModelState));
于 2014-02-21T15:30:36.810 回答
0

我没有找到这个问题的原因,但我写了一个解决方法。

我更改了 KendoUI 代码部分:

.Events(events => events.Error("error_handler"))

至:

.Events(events => 
            { 
               events.Error("error_handler");
               events.RequestEnd("force_update");
            })

然后在我显示网格的页面中添加了一个 javascript。

<script type="text/javascript">
    function force_update(e) {
        if (e.type === "create") {
            location.reload();
        }
     }
</script>
于 2013-08-03T07:57:12.770 回答
0

而不是使用 location.reload() 你可以写 e.sender.read();

于 2013-09-11T12:53:12.367 回答
0

对我来说,问题在于网格中存在冲突,因为我没有正确清空数据源

确保像这样清空数据源:

$("#grid").data("kendoGrid").dataSource.data([ ]);

于 2019-02-07T15:56:12.697 回答
-1

您可以根据record.Id. 如果存在则更新,如果不存在则创建新记录。

于 2014-04-16T12:24:51.057 回答
-1

我也遇到了这个问题。事实是您的网格没有在Read方法中获取记录的 ID,因此它调用 Create 而不是 Update

于 2019-04-09T04:37:01.253 回答