1

AJAX POST に問題があります。AJAX 呼び出しを投稿する場所を定義していますが、別の場所に投稿しています。助けてください。

MVC Telerik Grid を使用しています。あなたがそれに慣れていなくても、おそらく問題ではありません。http://demos.telerik.com/aspnet-mvc/razor/grid/editingbatchの例に従っています

その例から、このグリッド パズルの重要なピースは次のとおりです。

.Editable(editing => editing.Mode(GridEditMode.InCell))

また、その例から、AJAX 呼び出しの URL を定義します。

.DataBinding(dataBinding => dataBinding.Ajax()
        .Select("_SelectContactsBatchEditing", "Ajax", new {FirstName = @ViewData["FirstName"], LastName = @ViewData["LastName"]})
        .Update("_SaveContactsBatchEditing", "Ajax", new {FirstName = @ViewData["FirstName"], LastName = @ViewData["LastName"]})
    )

Select()とメソッドの両方Update()で、最初のパラメーターはアクションで、2 番目のパラメーターはコントローラーです。投稿で送り返す他のデータを含む 3 番目のオプションのパラメーターがあります。

私のグリッドはマスター/詳細です。詳細部分を取り出しましたが、まだ問題が発生しています。私はあなたに私のグリッド全体を与えました。ここでは、マスター部分に焦点を当てましょう。

@(Html.Telerik().Grid<ContactView>()
    .Name("ContactsGrid")
    .Columns(columns =>
    {
        columns.Bound<int>(c => c.Id).Width(65).ReadOnly();
        columns.Bound<string>(c => c.FirstName).Width(100);
        columns.Bound<string>(c => c.LastName).Width(100);
        columns.Bound<string>(c => c.Phone).Width(120);
        columns.Bound<string>(c => c.Street).Width(200);
        columns.Bound<string>(c => c.City).Width(100);
        columns.Bound<string>(c => c.Province).Width(50).Title("Prov");
        columns.Bound<string>(c => c.PostalCode).Width(80).Title("PC");
        columns.Bound<string>(c => c.Email).Width(100);
        columns.Bound<bool>(c => c.OkToContact).Width(40).Title("Ok")
            .ClientTemplate("<input type='checkbox' disabled='disabled' name='OkToContact' <#=OkToContact? checked='checked' : '' #> />");
        columns.Command(commands =>
        {
            commands.Delete();
        }).Width(100);
    })
    .DetailView(details => details.ClientTemplate(
            Html.Telerik().Grid<DonationView>()
                .Name("Donations_<#= Id #>")
                .Resizable(resizing => resizing.Columns(true))
            .Editable(editing => editing.Mode(GridEditMode.InCell).DefaultDataItem(new DonationView(){Description = "Internal Cause"}))
                .DataKeys(d => d.Add<int>(a => a.Id).RouteKey("Id"))
                .Columns(columns =>
                {
                    columns.Bound(o => o.Id).Width(65).ReadOnly();
                    columns.Bound(o => o.Description).Width(400);
                    columns.Bound(o => o.Amount).Width(80);
                    columns.Bound(o => o.Date).Format("{0:d}");
                })
                /*.ClientEvents(events => events.OnRowDataBound("cause_onRowDataBound"))*/
                .DataBinding(dataBinding => dataBinding.Ajax()
                    .Select("_SelectDonationsHierarchyBatchEditing", "Ajax", new { ContactID = "<#= Id #>" })
                    .Update("_SaveDonationsHierarchyBatchEditing", "Ajax", new {ContactID = "<#= Id #>"})
                )
                .Sortable()
                .ToolBar(commands => {
                    commands.Insert();
                    commands.SubmitChanges();
                })
                /*.Filterable()*/
                .ToHtmlString()
    ))
    .DataBinding(dataBinding => dataBinding.Ajax()
        .Select("_SelectContactsBatchEditing", "Ajax", new {FirstName = @ViewData["FirstName"], LastName = @ViewData["LastName"]})
        .Update("_SaveContactsBatchEditing", "Ajax", new {FirstName = @ViewData["FirstName"], LastName = @ViewData["LastName"]})
    )
    .Resizable(resizing => resizing.Columns(true))
    //.Pageable(paging => paging.PageSize(25))
    .Editable(editing => editing.Mode(GridEditMode.InCell))
    .DataKeys(d => d.Add<int>(a => a.Id).RouteKey("Id"))
    .Scrollable(scrolling => scrolling.Height(500))
    .ToolBar(commands => {
        commands.Insert();
        commands.SubmitChanges();
    })
    //.HtmlAttributes(new { style = "width: 1200px" } ) 
    .Sortable()
      )

私のSelect()メソッドは正しく呼び出しますが、私のメソッドは正しくUpdate()ありません。グリッドが存在する同じページに投稿するだけです。私はこれを機能させましたが、チェックインすることを気にせず(ばか)、数日後にそれを壊しました。Ctrl+Z の量は私を助けませんでした。

これが私の Ajax コントローラーのアクションです。詳細は関係ないので削除。メソッドが呼び出されていません。

 [GridAction]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult _SaveContactsBatchEditing([Bind(Prefix = "inserted")]IEnumerable<ContactView> insertedContacts,
            [Bind(Prefix = "updated")]IEnumerable<ContactView> updatedContacts,
            [Bind(Prefix = "deleted")]IEnumerable<ContactView> deletedContacts, string FirstName, string LastName)
        {
            ISession session = SessionManager.OpenSession();
            ContactProvider cp = new ContactProvider(session);
            if (insertedContacts != null)
            {
                //stuff
            }
            if (updatedContacts != null)
            {
                //stuff
            }
            if (deletedContacts != null)
            {
                //stuff
            }

            IList<ContactView> Contacts = new List<ContactView>();
            ContactViewProvider Provider = new ContactViewProvider(SessionManager.OpenSession());
            Contacts = Provider.GetContactsByName(FirstName, LastName);
            //return View(new GridModel(Contacts));
            return new LargeJsonResult
            {
                MaxJsonLength = int.MaxValue,
                JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet,
                Data = new GridModel<ContactView>
                {
                    Data = Contacts
                }
            };
        }

グリッドのツールバーの [保存] ボタンをクリックすると、firebug を使用して、Select()メソッドが適切な AJAX 呼び出しを行っていることを確認できますが、Update()メソッドはそうではありません: ( http://i.stack.imgur.com/GPCS6.pngを参照)

この画像では、最初の投稿 URL がSelect()メソッドに渡された値に対応しています。Update()2 番目の投稿 URL が私の方法と一致しません。

何が起きてる?前もって感謝します

4

1 に答える 1

0

だから、私がしたことには何も問題がないことがわかりました。MVC プロジェクトはどういうわけか台無しになりました。

問題を再現するために使い捨てプロジェクトを作成しましたが、できませんでした-使い捨ては機能していました。そのため、ソリューションで MVC プロジェクトを削除し、その一部を新しいプロジェクトに 1 つずつコピーしましたが、うまくいきました。そもそもどのようにして解体されたのかはわかりませんが、少なくとも問題は修正されています。同じ問題を抱えている人は、これを試すことをお勧めします!

于 2013-05-28T17:09:16.293 に答える