如何在asp.NETMVC2中反序列化jqgrid多组搜索条件

如何在asp.NETMVC2中反序列化jqgrid多组搜索条件,asp.net,asp.net-mvc,asp.net-mvc-2,serialization,jqgrid,Asp.net,Asp.net Mvc,Asp.net Mvc 2,Serialization,Jqgrid,如果使用多个分组,jqgrid advanced search可以生成如下搜索条件 {"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":"kk"},{"field":"Nimi","op":"cn","data":"kkk"}],"groups":[]}]} 尝试在ASP.NETMVC2中使用 var serializer = n

如果使用多个分组,jqgrid advanced search可以生成如下搜索条件

{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":"kk"},{"field":"Nimi","op":"cn","data":"kkk"}],"groups":[]}]}
尝试在ASP.NETMVC2中使用

            var serializer = new JavaScriptSerializer();
            var filtersList = serializer.Deserialize<Filter>(_filters);


class Filter
{
    public GroupOp groupOp { get; set; }
    public List<Rule> rules { get; set; }
    public List<Filter> groups { get; set; }
}

class Rule
{
    public string field { get; set; }
    public Operations op { get; set; }
    public string data { get; set; }
}

enum GroupOp
{
    AND,
    OR
}

enum Operations
{
    eq, // "equal"
    ne, // "not equal"
    lt, // "less"
    le, // "less or equal"
    gt, // "greater"
    ge, // "greater or equal"
    bw, // "begins with"
    bn, // "does not begin with"
    @in, // "in"
    ni, // "not in"
    ew, // "ends with"
    en, // "does not end with"
    cn, // "contains"
    nc  // "does not contain"
}
使用引用答案中更新部分的代码仍然会生成无效的where

    ((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!')AND(klient.Nimi ILIKE
 ('%' || E'' || '%') ESCAPE '!')AND(klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))AND
((((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))AND(((((())))AND(((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))AND(((klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!')
AND(klient.Nimi ILIKE ('%' || E'' || '%') ESCAPE '!'))))))))

我认为代码没有问题

const string filters = "{\"groupOp\":\"AND\",\"rules\":[]," +
    "\"groups\":[{\"groupOp\":\"AND\",\"rules\":[" +
        "{\"field\":\"Nimi\",\"op\":\"cn\",\"data\":\"kk\"}," +
        "{\"field\":\"Nimi\",\"op\":\"cn\",\"data\":\"kkk\"}],\"groups\":[]}]}";

var serializer = new JavaScriptSerializer();
var filtersList = serializer.Deserialize<Filter>(filters);
如果解析来自
filtersList
的信息,最后仍然可以得到
WHERE
语句,如下所示

(Nimi LIKE '%kk%') AND (Nimi LIKE '%kkk%')

例如,请参见更新部分的代码。与答案中的代码完全相同,生成的
((Nimi类似于“%kk%”)和(Nimi类似于“%kkk%”)
,实际上是相同的。

我尝试了更新的部分。对于空筛选器
{“groupOp”:“AND”,“rules”:[],“groups”:[]}
返回null@Andrus:这不对吗?确切地说,它是
newfilter{groupOp=groupOp.AND,rules=newlist(0),groups=newlist(0)}。因此,它与您的输入数据完全相同。您希望输入的反序列化值是什么?我更新了问题并添加了testcase,它使用@Andrus中更新的部分返回无效的where子句:我现在同意您应该进一步修改代码,使其没有类似
((())
@Andrus:我又更新了一次代码。主要问题是使用
StringBuilder
Capacity
属性,而不是
Length
属性。我添加了一些额外的代码,这些代码稍微减少了结果WHERE字符串中括号的数量。不需要更改代码。
var filtersList = new Filter {
    groupOp = GroupOp.AND,
    rules = new List<Rule>(0),
    groups = new List<Filter> {
        new Filter {
            groupOp = GroupOp.AND,
            rules = new List<Rule> {
                new Rule {field = "Nimi", op = Operations.cn, data = "kk"},
                new Rule {field = "Nimi", op = Operations.cn, data = "kkk"}
            },
            groups = new List<Filter>(0)
        }
    }
};
(Nimi LIKE '%kk%') AND (Nimi LIKE '%kkk%')