【问题标题】:Failed to Update data in Kendo grid, always create data无法更新剑道网格中的数据,始终创建数据
【发布时间】:2016-11-23 08:30:45
【问题描述】:

我想让数据 CRUD 在网格中内联。创建方法已成功完成。但是当我尝试进行更新时,它总是会创建新数据。当我尝试进行调试时。它总是转到 create 方法。请任何人帮助我。我在 C# 中使用 KendoUI、MVC4。提前致谢

型号

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace admission.Models
{
    public class JenisUjianModel
    {
        public JenisUjianModel() { }

        public int id_jenis_ujian { set; get; }
        public string jenis_ujian { set; get; }
        public DateTime tgl_ujian { set; get; }
        public string created { set; get; }
        public string createdBy { set; get; }
        public string modified { set; get; }
        public string modifiedBy { set; get; }
        public string flag { set; get; }
    }
    public class UjianJenisModel
    {
        pmbEntities entities = new pmbEntities();

        public IEnumerable<JenisUjianModel> Read()
        {
            return entities.Tbl_Jenis_Ujian.Select(jnis => new JenisUjianModel
            {
                id_jenis_ujian = jnis.id_jenis_ujian,
                jenis_ujian = jnis.jenis_ujian,
                tgl_ujian = jnis.Tgl_Ujian.Value
            }).OrderBy(u => u.id_jenis_ujian);
        }

        public void Create(JenisUjianModel jnis)
        {
            var entity = new Tbl_Jenis_Ujian();
            int last = entities.Tbl_Jenis_Ujian.Max(u => u.id_jenis_ujian);
            int coun = entities.Tbl_Jenis_Ujian.Count();
            if (coun == 0)
            {
                entity.id_jenis_ujian = 0;
            }
            else
                entity.id_jenis_ujian = last + 1;

            entity.jenis_ujian = jnis.jenis_ujian;
            entity.Tgl_Ujian = jnis.tgl_ujian;
            entity.created = DateTime.Now;
            entity.flag = "Y";

            entities.Tbl_Jenis_Ujian.Add(entity);
            entities.SaveChanges();

        }

        public void Update(JenisUjianModel jnis)
        {
            var entity = new Tbl_Jenis_Ujian();
            entity.id_jenis_ujian = jnis.id_jenis_ujian;
            entity.jenis_ujian = jnis.jenis_ujian;
            entity.Tgl_Ujian = jnis.tgl_ujian;
            entity.modified = DateTime.Now;
            entity.modifiedBy = jnis.modifiedBy;
            entity.created = DateTime.Parse(jnis.created);
            entity.createdBy = jnis.createdBy;
            entity.flag = jnis.flag;

            entities.Tbl_Jenis_Ujian.Attach(entity);
            entities.Entry(entity).State = EntityState.Modified;
            entities.SaveChanges();
        }

        public void Destroy(JenisUjianModel jnis)
        {
            var entity = new Tbl_Jenis_Ujian();
            entity.id_jenis_ujian = jnis.id_jenis_ujian;
            entity.jenis_ujian = jnis.jenis_ujian;
            entity.Tgl_Ujian = jnis.tgl_ujian;
            entity.modified = DateTime.Parse(jnis.modified);
            entity.modifiedBy = jnis.modifiedBy;
            entity.created = DateTime.Parse(jnis.created);
            entity.createdBy = jnis.createdBy;
            entity.flag = "N";

            entities.Tbl_Jenis_Ujian.Attach(entity);
            entities.Entry(entity).State = EntityState.Modified;
            entities.SaveChanges();
        }
    }
}

控制器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using admission.Models;
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using System.Data.Entity;

namespace admission.Controllers
{
    public class UjianController : Controller
    {
        //
        // GET: /Ujian/

        UjianJenisModel uj = new UjianJenisModel();

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult JenisUjian() { return View(); }

        public ActionResult jenisUjian_read([DataSourceRequest] DataSourceRequest request)
        {
            return Json(uj.Read().ToDataSourceResult(request));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult jenisUjian_Create([DataSourceRequest] DataSourceRequest request, JenisUjianModel jnis)
        {
            if (ModelState.IsValid)
            {
                uj.Create(jnis);
            }

            return Json(new[] { jnis }.ToDataSourceResult(request, ModelState));
        }
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult jenisUjian_Update([DataSourceRequest] DataSourceRequest request, JenisUjianModel jnis)
        {
            if (ModelState.IsValid)
            {
                uj.Update(jnis);
            }

            return Json(new[] { jnis }.ToDataSourceResult(request, ModelState));
        }
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult jenisUjian_Delete([DataSourceRequest] DataSourceRequest request, JenisUjianModel jnis)
        {
            if (jnis != null)
            {
                uj.Destroy(jnis);
            }

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

    }
}

查看

@using Kendo.Mvc.Extensions

@{
    ViewBag.Title = "JenisUjian";
    Layout = "~/Views/Shared/_adminLayout.cshtml";
}

<div class="tables">
    <div class="table-responsive bs-example widget-shadow">
        <h4>Data Propinsi:</h4>
            @(Html.Kendo().Grid<admission.Models.JenisUjianModel>()
    .Name("gridss")
    .Columns(columns =>
    {
        columns.Bound(p => p.id_jenis_ujian).Hidden();
        columns.Bound(p => p.jenis_ujian).Title("Jenis Ujian");
        columns.Bound(p => p.tgl_ujian).Title("Tgl Ujian").Format("{0: dd MMM yyyy - HH:mm WIB}");
        columns.Command(command => { command.Edit(); command.Destroy(); }).Width(250);
    })
    .ToolBar(toolbar => toolbar.Create())
    .Editable(editable => editable.Mode(GridEditMode.InLine))
    .Pageable()
    .Sortable()
    .Filterable()
    .HtmlAttributes(new { style = "height:570px;" })
    .DataSource(dataSource => dataSource
        .Ajax()
        .PageSize(10)
        .Events(events => 
        { 
            events.Error("error_handler");
            events.RequestEnd("force_update");
        })
        .Model(model => model.Id(p => p.id_jenis_ujian))
        .Create(update1 => update1.Action("jenisUjian_Create", "Ujian"))
        .Update(update2=> update2.Action("jenisUjian_Update", "Ujian"))
        .Read(read => read.Action("jenisUjian_read", "Ujian"))
        .Destroy(update3 => update3.Action("jenisUjian_Delete", "Ujian"))
    )
)
    </div>
</div>

<script type="text/javascript">
    function error_handler(e) {    
        if (e.errors) {
            var message = "Errors:\n";
            $.each(e.errors, function (key, value) {
                if ('errors' in value) {
                    $.each(value.errors, function() {
                        message += this + "\n";
                    });
                }
            });        
            alert(message);
        }
    }
</script>
<script type="text/javascript">
    function force_update(e) {
        if (e.type === "create") {
            location.reload();
        }
    }
</script>

【问题讨论】:

    标签: c# asp.net-mvc-4 kendo-grid telerik-mvc


    【解决方案1】:

    如果您发现创建总是发生,这将是因为生成 id 时网格的default 特性。

    当将项目保存回您的系统时,我假设它会在某处自动增加主键。这个new id 需要分配给返回给网格的模型,以便它知道如果对该项目进行进一步更改,将生成更新操作。

    所以在代码部分:

     uj.Create(jnis);
    

    更改此设置,以便将 id 分配回模型。也许是这样的:

    jnis.id_jenis_ujian = uj.Create(jnis); 
    

    jnis = uj.Create(jnis);
    

    然后更改您的创建签名以返回 int 或模型,而不是将其作为 void。

     public int Create(JenisUjianModel jnis)
     {
         ....Code removed for brevity
         int returnId = lastId + 1; 
    
         return returnId; 
     }
    

    public JenisUjianModel Create(JenisUjianModel jnis)
         {
             ....Code removed for brevity
             jnis.id_jenis_ujian = lastId + 1; 
    
             return jnis; 
         }
    

    希望这对您有所帮助。

    如有任何问题,请随时提出。

    【讨论】:

    • 没用。它仍然会创建新数据。更新失败
    • 我之前没有注意到,但尝试禁用您的 update 事件 events.RequestEnd("force_update"); 这可能会干扰数据源,因此重新加载 cached 状态
    【解决方案2】:

    使用下面的链接下载并安装 Fiddler

    https://www.telerik.com/download/fiddler

    正如@David Shorthose 所说,ID 一定是在途中遗漏的。

    使用 Fiddler 检查您发送到您的操作的数据,或使用以下代码行在 Chrome 开发人员工具 (F12) 中调试您的 Grid 数据:

    debugger;
    $("#gridss").data("kendoGrid").dataSource.data();
    

    如果您无法自行解决,请报告您收集的数据,以便我们能够帮助您更有洞察力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2017-02-24
      • 2015-10-19
      相关资源
      最近更新 更多