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")を発生させていました。剣道はそれは本当にエラーなので、UIには何の変更も加えていませんが、dirtyプロパティをtrueに設定しています!

今、私の上司は、他のイベントを発生させるためにajaxCompleteを使用している間に、新しいバージョンのKendoUIを取得しようとしています。残念ながら、新しいバージョンを入手するまで、私にはあまり選択肢がありません。

于 2013-01-22T08:54:47.830 に答える
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 に答える
0

新しいレコードを作成するときのデフォルトのintid値は0です。

保存ボタンを押すと、レコードがサーバーに送信され、更新されたID(データベースから取得されたID)を持つアイテムを返す必要があります。次に、グリッドがその値を読み取り、デフォルトの値(ゼロ)とは異なることを確認すると、クライアントに戻り、新しいレコードが正常に挿入されたとマークされます。アイテムが返されないか、更新されたID値が欠落している場合、グリッドは引き続きレコードをダーティとしてマークし、今後の[save/saveChanges]ボタンのクリック時にサーバーに再送信し続けます。

デフォルトのID値を変更する場合は、モデル定義内でDefaultValueメソッドを使用できます。

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