1

並べ替えとページング機能をグリッドで動作させるのに問題があります。Ajax Databindning を使用して、データで満たされたグリッドがあります。ただし、フィルタリング情報を更新または変更しようとすると、エラー 500 が表示されます。すべての入力をコントローラーに渡す検索機能があります。

        public ActionResult Results(FormCollection form)
    {
        string foo= form["foo"];
        string bar= form["bar"];


        model.Result(foo, bar);
        var data = model.FilterResult().Select(o => new SearchViewModel
                        {
                            //Binding SearchViewModel propertys with the XML-elements found in model.FilterResults().
                            Foo= o.Element("Foo").Value,
                            Bar = o.Element("Bar").Value
                        });

        return View(data);
    }

コントローラーでは、基本的に入力値をモデルのプロパティに設定する「Result()-メソッド」を呼び出します。「FilterResult()」メソッドは、ユーザー入力 (プロパティ) を使用して、LINQ を使用して XML ファイルをクエリします。このメソッドは、XElements を含む IEnumerable を返します。

私の見解は次のようになります。

Html.Telerik().Grid(Model)
                .Name("Search")
                .PrefixUrlParameters(false)
                .DataKeys(keys => { keys.Add(m => m.Foo); })
                            .Columns(columns =>
                            {
                                columns.Bound(o => o.Foo);
                                columns.Bound(o => o.Bar);
                            })
                .DataBinding(dataBinding =>
                {
                    dataBinding.Ajax()       
                        .Select("Results", "Search").Enabled(true);   
                })
                .Pageable(pager => pager.Enabled(true).PageSize(20))
                .Sortable(sorting => sorting.Enabled(true).OrderBy(sortOrder => sortOrder.Add(o => o.TimeStamp).Ascending()))
                .Filterable(filterable => filterable.Enabled(true))
                .Render();

フィルタリング設定を変更しようとすると、入力値 (コントローラー内) に対してエラー 500 と NullException の両方を受け取ります。ユーザーが新しい検索を行わずにコントローラーにコールバックし、null 値になるため、null であることがわかりました。だから私はこれをどのように行うことができるのだろうか?既にグリッドにあるデータに対してのみフィルタリングと並べ替えを行いたいです。

4

1 に答える 1

0

foo と bar がページのフォーム要素である場合、ajax を使用してページを送信できるため、データバインド時に同じ方法でデータを呼び出すことができます。次に、ビューで ClientEvents をグリッドに追加します。

.ClientEvents(events => events.OnDataBinding("onDataBinding"))

onDataBinding 関数は次のようになります。

<script type="text/javascript">
  function onDataBinding(e) {
    var foo = document.getElementById('foo').value;
    var bar = document.getElementById('bar').value;
    var params = { pFoo: foo, pBar: bar };
    var paramsStr = $.param(params);
    var selectUrl = '@Url.Action("Results", "Search")'
      + "?" + paramsStr;
    var grid = $('#Grid').data('tGrid');
    grid.ajax.selectUrl = selectUrl;
  } 
</script>

コントローラーでは、渡すパラメーターは foo と bar になります。

public ActionResult Results(string pFoo, string pBar)

送信機能は次のようになります。

<script type="text/javascript">
  function displaySummary() {
    var grid = $('#Grid').data('tGrid');
    var foo = document.getElementById('foo').value;
    var bar = document.getElementById('bar').value;
    $.ajax(
    {
      type: 'POST',
      url: '@Url.Action("Results", "Search")',
      dataType: 'json',
      data: { pFoo: foo, pBar: bar },
      success: function (result) {
        grid.dataBind(result);
      },
      error: function (req, status, error) {
        alert("Sorry! Error. " + status + error);
      }
    });
  }
</script>
于 2012-06-21T14:04:29.203 に答える