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

C# 使用DevExpress GridView自定义绑定的建议,c#,asp.net,gridview,devexpress,C#,Asp.net,Gridview,Devexpress,我正在使用DevExpress MVCxGridView实现自定义分页和绑定 这里有演示的链接 现在,数据本身来自api,因此,例如,数据的GET端点可以是 public IHttpActionResult GetUsers( string username = null, string surname = null, string postcode = null, bool includearchived = false

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

这里有演示的链接

现在,数据本身来自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);
    }
public IHttpActionResult GetUsers(
字符串username=null,
字符串姓氏=null,
字符串postcode=null,
bool includeChived=false,
int?pagesize=null,
int?pageoffset=null)
{
var predicate=PredicateBuilder.True();
如果(用户名!=null)
谓词=谓词。和(x=>x.Username.Contains(Username));
if(姓氏!=null)
谓词=谓词和(x=>x.姓氏包含(姓氏));
如果(邮政编码!=null)
谓词=谓词和(x=>x.Postcode.Contains(Postcode));
如果(!includeChived)
谓词=谓词和(x=>x.Archived==false);
var results=_Service.GetUsers(谓词、pageoffset、pagesize);
//过滤掉不需要的列
var筛选=结果中的x
选择新的
{
userid=x.ID,
日期=x.日期,
username=x.username
firstname=x.firstname,
姓氏=x.姓氏,
邮政编码=x。邮政编码,
typeid=x.Type.ID,
usertype=x.Type.ID==0?“Demo1”:“Demo2”,
已存档=x.已存档
};
返回Ok(已过滤);
}
其中pagesize和offset从网格中传递。所以我可以得到一页特定的数据。上面是一个粗略的示例,但基本上是使用传递的参数构建谓词,执行返回过滤器以将从EF返回的字段缩减为只需要的字段(还将字段设置为小写)

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

[路由(“计数”)]
公共IHttpActionResult GetUsersCount(
字符串username=null,
字符串姓氏=null,
字符串postcode=null,
bool includeChived=false,
int?pagesize=null,
int?pageoffset=null)
{
var predicate=PredicateBuilder.True();
如果(用户名!=null)
谓词=谓词。和(x=>x.Username.Contains(Username));
if(姓氏!=null)
谓词=谓词和(x=>x.姓氏包含(姓氏));
如果(邮政编码!=null)
谓词=谓词和(x=>x.Postcode.Contains(Postcode));
如果(!includeChived)
谓词=谓词和(x=>x.Archived==false);
var results=_Service.GetUsers(谓词、pageoffset、pagesize);
返回Ok(results.Count);
}
我现在需要在网格中添加列过滤器,我提出了网格显示的列比端点上的过滤器多的问题。(可以在上面的演示链接中通过可搜索的标题文本字段查看)

我的问题是如何为每一个可能的列最好地处理这些过滤器。示例中从WebApi返回的JSON可能(通常情况下)包含GET端点的筛选器参数中不存在的其他字段(因此在上面的示例中,它包含国家、邮政编码等字段)

那么,当用户使用WebApi获取的列进行有效筛选时,是否无法处理搜索参数并相应返回

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

有没有人对可能的解决方案或解决办法有什么想法?我相信这可能是以前有人看到过的

    [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);
    }