当我尝试过滤(排序,分页等)我的网格时出错500

时间:2012-06-21 11:45:14

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

我无法使用排序和分页功能来处理我的网格。我有一个充满数据的网格,使用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() - Method”,它基本上将输入值设置为模型中的Properties。 “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();

当我尝试更改任何过滤设置时,我收到输入值(在我的控制器中)的Error 500和NullException。我已经意识到它是空的,因为它在没有用户进行新搜索的情况下回调控制器,导致空值。所以我想知道如何做到这一点?我只想对已经在网格中的数据进行过滤和排序。

1 个答案:

答案 0 :(得分: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>