【问题标题】:how to deserialize jqgrid multiple group search criteria in asp .net mvc2如何在asp .net mvc2中反序列化jqgrid多个组搜索条件
【发布时间】:2012-04-07 09:46:33
【问题描述】:

如果使用多个分组,jqgrid高级搜索可以生成类似的搜索条件

{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":"kk"},{"field":"Nimi","op":"cn","data":"kkk"}],"groups":[]}]}

尝试在 ASP .NET MVC2 中使用反序列化它

            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"
}

返回空的 filtersList.rules 属性

如何从这些数据中得到正确的规则?

更新

过滤器

    {"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":""},
{"field":"Nimi","op":"cn","data":""},{"field":"Nimi","op":"cn","data":""}],
"groups":[{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":
[{"field":"Nimi","op":"cn","data":""}],"groups":[{"groupOp":"AND","rules":[],
"groups":[{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],
"groups":[{"groupOp":"AND","rules":[],"groups":[{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]}]}]}]}]},{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":""}],"groups":[{"groupOp":"AND","rules":[{"field":"Nimi","op":"cn","data":""},{"field":"Nimi","op":"cn","data":""}],
"groups":[]}]},{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]},{"groupOp":"AND","rules":[],"groups":[]}]}]}]}

在引用的答案中使用更新部分的代码仍然会生成无效的位置

    ((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 '!'))))))))

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-2 serialization jqgrid


    【解决方案1】:

    我看代码没问题

    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,其中filtersList.rules 是空列表。它对应于您拥有的输入数据。另一方面,filtersList.groups 部分不为空。上述代码中的filtersList 将产生Filter 对象,相当于以下直接初始化:

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

    如果解析来自filtersList 的信息,最后仍然可以得到WHERE 语句,如下所示

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

    例如查看the answer 的更新部分的代码。确切地说,答案中的代码会产生((Nimi LIKE '%kk%')AND(Nimi LIKE '%kkk%')),这实际上是相同的。

    【讨论】:

    • 我尝试了更新的部分。对于空过滤器{"groupOp":"AND","rules":[],"groups":[]},它返回 null
    • @Andrus:不正确吗?确切地说是new Filter { groupOp = GroupOp.AND, rules = new List&lt;Rule&gt; (0), groups = new List&lt;Filter&gt;(0) };。因此,它与您的输入数据完全相同。您期望输入的反序列化值是多少?
    • 我更新了问题并添加了测试用例,该测试用例使用来自stackoverflow.com/a/10052736/315935的更新部分返回无效的 where 子句
    • @Andrus:我现在同意你应该对代码进行更多修改,使其没有像 (((()))) 这样的结构。
    • @Andrus:我又更新了一次代码。主要问题是使用StringBuilderCapacity 属性而不是Length 属性。我添加了额外的代码,减少了生成的 WHERE 字符串中括号的数量。不需要更改代码。
    猜你喜欢
    • 2012-03-24
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多