【问题标题】:Error 500 when I'm trying to filter (sorting, paging etc.) my grid当我尝试过滤(排序、分页等)我的网格时出现错误 500
【发布时间】:2012-06-21 11:45:13
【问题描述】:

我无法让排序和分页功能与我的网格一起使用。我有一个使用 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”,它基本上将输入值设置为模型中的属性。 “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(在我的控制器中)。我已经意识到它是空的,因为它在没有用户进行新搜索的情况下回调控制器,导致空值。所以我想知道如何做到这一点?我只想对网格中已经存在的数据进行过滤和排序。

【问题讨论】:

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


    【解决方案1】:

    如果 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>
    

    【讨论】:

    • 好的,我会试试的。尽管我没有使用 Ajax 提交页面,但我尝试了类似的方法,只是调用它。但这不起作用:)
    • 我无法将表单值输入控制器。似乎 displaySummary() 函数没有运行。我将该函数放在表单所在的视图中,并将 onDataBinding 放在网格视图中。我也尝试使用 $(#'Foo').val() 没有结果。
    • 首先确认是否调用了displaySummary。在函数的开头放置一个警报: function displaySummary() { alert('in displaySummary');如果可行,则以相同的方式检查 foo 和 bar 值。
    • 我在提交表单时设法使用 displaySummary 函数解决了这个问题。然后我返回了包含结果的视图。在我的网格中,我将它数据绑定到一个新控制器,该控制器绑定了从另一个控制器接收到的值。该控制器返回一个新的 GridModel。感谢您的输入! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2015-04-03
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多