使用DevExpress GridView自定义绑定的建议

时间:2015-10-23 03:55:52

标签: c# asp.net gridview devexpress

我正在使用DevExpress MVCxGridView实现自定义分页和绑定。

这里有演示链接;

https://demos.devexpress.com/MVCxGridViewDemos/DataBinding/AdvancedCustomBinding

现在数据本身来自api,所以例如数据的GET终点可能是;

    public IHttpActionResult GetUsers(
        string username = null,
        string surname = null,
        string postcode = null,
        bool includearchived = false,
        int? pagesize = null,
        int? pageoffset = null)
    {
       var predicate = PredicateBuilder.True<Users>();

        if(username != null)
             predicate = predicate.And(x => x.Username.Contains(username));

        if(surname != null)
             predicate = predicate.And(x => x.Surname.Contains(surname));

        if(postcode != null)
             predicate = predicate.And(x => x.Postcode.Contains(postcode));

        if (!includearchived)
            predicate = predicate.And(x => x.Archived == false);

        var results = _Service.GetUsers(predicate, pageoffset, pagesize);

        //filter out columns which are not needed
        var filtered = from x in results
                       select new
                       {
                           userid = x.ID,
                           date = x.Date,
                           username = x.Username
                           firstname = x.Firstname,
                           surname = x.Surname,
                           postcode = x.Postcode,
                           typeid = x.Type.ID,
                           usertype = x.Type.ID == 0 ? "Demo1" : "Demo2", 
                           archived = x.Archived
                       };

        return Ok(filtered);
    }

其中pagesize和offset从网格传递过来。所以我可以得到一个特定的数据页面。以上是一个粗略的例子,但基本上这个想法是谓词是使用传递的参数建立的,返回过滤器是为了将从EF返回的字段减少到只需要的字段(并且还将字段设置为小写) 。

(然后有一个额外的“/ count”,它使用相同的参数减去pagsize和offset并返回原始查询中的行数,因此Grid知道返回的可能行数。这个示例方法是)

    [Route("count")]
    public IHttpActionResult GetUsersCount(
        string username = null,
        string surname = null,
        string postcode = null,
        bool includearchived = false,
        int? pagesize = null,
        int? pageoffset = null)
    {
        var predicate = PredicateBuilder.True<Users>();

        if(username != null)
             predicate = predicate.And(x => x.Username.Contains(username));

        if(surname != null)
             predicate = predicate.And(x => x.Surname.Contains(surname));

        if(postcode != null)
             predicate = predicate.And(x => x.Postcode.Contains(postcode));

        if (!includearchived)
            predicate = predicate.And(x => x.Archived == false);

        var results = _Service.GetUsers(predicate, pageoffset, pagesize);

        return Ok(results.Count);
    }

我现在需要将列过滤器添加到网格中,我认为网格显示的列数多于终点上的过滤器。 (可以在上面的演示链接中看到可搜索的标题文本字段)。

我的问题是如何最好地处理evey可能列的这些过滤器。从WebApi返回的JSON示例可能(更多内容而非)将包含GET端点的过滤器参数中不存在的其他字段(因此在上面的示例中,它包含国家,邮政编码等字段)。

因此,当用户有效过滤使用列时,WebApi GET无法处理搜索参数并返回相应的返回值?

(因为这是一个由db驱动的通用解决方案,所以实际上api端点不能被编辑来处理所有返回的列过滤器,除非我们可以传递某种文本数组,它通常可以用于api端吗?)

有没有人对此可能的解决方案或解决方法有任何想法?我确信这可能是某人之前在某个时候看到过的。

0 个答案:

没有答案