0

我的 mvc 项目中有一个剑道网格(内联模式),我通过 mvc 初始化了网格。问题是当我添加一个新行时,它的 id 为 0,并且它的脏属性设置为 true。如何刷新添加的项目并为其设置正确的 ID?

这是我的剑道网格:

@(Html.Kendo().Grid<IranHost.Tools.Services.Core.DataModel.Site>()
                                    .Name("grid")
                                    .Columns(columns =>
                                    {
                                        columns.Bound(p => p.Domain).Width(250).Title("دامین");
                                        columns.Command(command => { command.Edit().Text("ویرایش").UpdateText("ذخیره").CancelText("لغو"); command.Destroy().Text("حذف"); });
                                    })
                                    .ToolBar(toolbar => toolbar.Create().Text("افزودن دامین جدید").HtmlAttributes(new { @class = "add-button" }))
                                    .Editable(editable => { editable.Mode(GridEditMode.InLine); })
                                    .Sortable()
                                    .Pageable()
                                    .Scrollable()
                                    .Events(action => { action.Edit("gridEdit"); action.Save("gridSave"); action.SaveChanges("gridSaveChanges"); })
                                    .DataSource(dataSource => dataSource
                                        .Ajax()
                                        .Events(events => { events.Error("result_handler"); })
                                        .Model(model => model.Id(p => p.Id))
                                        .Create(create => create.Action("AddDomain", "Service", new { customerID = ViewBag.CustomerId }))
                                        .Read(read => read.Action("GetDomainListForGrid", "Service", new { customerID = ViewBag.CustomerId }))
                                        .Update(update => update.Action("EditDomain", "Service"))
                                        .Destroy(destroy => destroy.Action("DeleteDomain", "Service"))
                                    )
                                    )

这就是我在服务器端所做的:

public ActionResult AddDomain([DataSourceRequest] DataSourceRequest request, DataModel.Site site)
    {
        if (ModelState.IsValid)
        {
            var pattern = "([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w\\.-]*)";
            if (!Regex.IsMatch(site.Domain, pattern))
            {
                //TODO: Must be added in the framework.
                ModelState.AddModelError("ERROR", "Wrong URL Format!");
                return Json(ModelState.ToDataSourceResult(), JsonRequestBehavior.AllowGet);
            }

            var siteContext = new Biz.Site(DataContext);
            siteContext.Add(site);
            DataContext.SaveChanges();
            ModelState.AddModelError("ADDED", site.id);
            return Json(new[] { site }.ToDataSourceResult(request, ModelState), JsonRequestBehavior.AllowGet);
        }

        return new HttpStatusCodeResult(403);
    }

但是还是不行!

4

3 回答 3

0

问题解决了!我使用的是旧版本的 KendoUI,它没有 requestEnd,所以我开始使用 AddModelError 来处理服务器端结果。实际上,我使用 AddModelError 不是为了错误,而只是告诉客户端添加/编辑该项目是成功的。

这实际上是一个非常糟糕的主意,但我现在别无选择。在客户端,我提出了 Events.Error("result_handler")。Kendo 虽然这确实是一个错误,所以它没有对 ui 进行任何更改,而是将脏属性设置为 true!

现在我的老板正试图在我使用 ajaxComplete 引发其他事件的同时获得新版本的 KendoUI。不幸的是,在我获得更新版本之前,我真的没有太多选择!

于 2013-01-22T08:54:47.830 回答
0

创建新记录时,默认 int id 值为 0。

这个想法是当你点击保存按钮时,记录被发送到服务器,你需要返回带有更新的 id 的项目(从数据库中检索到的那个)。然后返回客户端,当 Grid 读取该值并看到它与默认值(零)不同时,它将将新记录标记为成功插入。如果没有返回项目或缺少更新的 id 值,则 Grid 将继续将记录标记为脏记录,并将在未来单击 save/saveChanges 按钮时继续将其重新发送到服务器。

如果要更改默认 ID 值,可以在模型定义中使用 DefaultValue 方法。

.Model(model => model.Id(p => p.Id).DefaultValue(-42))
于 2013-01-21T17:18:37.393 回答
0

您需要在任何 CRUD 操作之后将记录返回到网格。您甚至希望在 Destory 上执行此操作,以便为您的 error_handler 事件返回错误。这是我在此处发布的许多答案中使用的代码,还有一些额外的内容,但您应该查看的是如何将单个记录转换为列表,就像最初的读取一样。如果需要,请查看我的其他答案以获取有关模型和 FlattenToThis 的更多详细信息。但我认为这应该足以让你到达你要去的地方。

[HttpPost]
public JsonResult CreatePerson([DataSourceRequest]DataSourceRequest request, Person person)
{
    if (ModelState.IsValid)
    {
        try
        {
            person = _personDataProvider.Create(person);
        }
        catch (Exception e)
        {
            ModelState.AddModelError(string.Empty, e.InnerException.Message);
        }
    }
    var persons = new List<Person> {person};
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request, ModelState);
    return Json(result, JsonRequestBehavior.AllowGet);
}

public JsonResult ReadPeople([DataSourceRequest]DataSourceRequest request)
{
    var persons = _personDataProvider.Read(false);
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request);
    return Json(result, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public JsonResult UpdatePerson([DataSourceRequest]DataSourceRequest request, Person person)
{
    if (ModelState.IsValid)
    {
        try
        {
            person = _personDataProvider.Update(person);
        }
        catch (Exception e)
        {
            ModelState.AddModelError(string.Empty, e.InnerException.Message);
        }
    }
    var persons = new List<Person>() {person};
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request, ModelState);
    return Json(result, JsonRequestBehavior.AllowGet);
}

[HttpPost]
public JsonResult DestroyPerson([DataSourceRequest]DataSourceRequest request, Person person)
{
    if (ModelState.IsValid)
    {
        try
        {
            person = _personDataProvider.Destroy(person);
        }
        catch (Exception e)
        {
            ModelState.AddModelError(string.Empty, "There was an error deleting this record, it may still be in use.");
        }
    }
    var persons = new List<Person>() {person};
    DataSourceResult result = PersonModel.FlattenToThis(persons).ToDataSourceResult(request, ModelState);
    return Json(result, JsonRequestBehavior.AllowGet);
}
于 2013-01-21T19:36:31.593 回答