c# - Kendo MVC 在 Update 调用上触发 Create 方法

标签 c# kendo-grid kendo-asp.net-mvc

我正在将 Kendo UI Grid 与 MVC 4 结合使用,它工作得很好,只有一个异常(exception)。

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

我可以告诉的是,如果我按添加,程序会进入我的 MVC Controller 中的 Create 方法,如果我在添加之后的一行上按更新,我再次输入Create方法。

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

这是我的 Razor View :

@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"))
  ))

这是我的 Controller :

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());
    } 
}

这是我的 View 模型

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; }
}

最佳答案

我记得以前遇到过这个问题,但我找不到解决方法。

将模型保存到数据库后,请确保它具有 ID,然后再从方法返回它。 (调试并观察 model 对象)。如果没有,您可以尝试这样的操作:

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

关于c# - Kendo MVC 在 Update 调用上触发 Create 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17998323/

相关文章:

asp.net-mvc - Telerik 远程虚拟化 (Kendo Grid)

javascript - Kendo UI for 网格列模板中的循环导致无限循环

javascript - Kendo UI 网格单元格背景色

angularjs - Kendo ui Grid 的每一行上都有一个按钮,用于扩展详细信息 View

javascript - Kendo UI 网格多列使用字段名称隐藏/显示

asp.net-mvc - 如何将 Kendo UI MVC 扩展与 require js 一起使用?

C#通过按键结束图像移动

c# - 强制 HttpWebRequest 发送客户端证书

c# - 子类 HashSet 以便它在另一个集合中使用时始终使用某个 IEqualityComparer

c# - 无法读取配置部分 'assemblies',因为它缺少部分声明