C# 更新调用时Kendo MVC fire创建方法

C# 更新调用时Kendo MVC fire创建方法,c#,kendo-grid,kendo-asp.net-mvc,C#,Kendo Grid,Kendo Asp.net Mvc,我将剑道UI网格与MVC4一起使用,它运行良好,只有一个例外 如果我在网格中添加一行,并在更新一行之后,它最终会添加一行而不是更新它 我能说的是,如果我按add,程序将在我的MVC控制器中输入Create方法,如果我在add后按Update,我将再次输入Create方法 然而,如果我在启动后直接按下网格中的更新按钮,情况似乎并非如此。我使用Ajax调用来完成所有这些,因此这与调用之间页面不更新有关。如果我只执行一个命令,然后刷新页面,一切都会很好。我还使用实体框架作为ORM 这是我的剃须刀视图:

我将剑道UI网格与MVC4一起使用,它运行良好,只有一个例外

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

我能说的是,如果我按add,程序将在我的MVC控制器中输入Create方法,如果我在add后按Update,我将再次输入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; }
}

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

我更改了KendoUI代码部分:

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

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

<script type="text/javascript">
    function force_update(e) {
        if (e.type === "create") {
            location.reload();
        }
     }
</script>

功能强制更新(e){
如果(例如,类型==“创建”){
location.reload();
}
}

改用location.reload()您可以编写e.sender.read()

我记得以前有过一次这个问题,但我不知道如何解决它

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

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

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

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

确保像这样清空数据源:


$(“#网格”).data(“kendoGrid”).dataSource.data([])

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

我遇到了与OP相同的问题,这就解决了它。似乎telerik需要Id才能知道该物品不再是新的。
model.Id = saveditem.Id;
return Json(new[] { model }.ToDataSourceResult(request, ModelState));