【问题标题】:Dynamic Query Builder for ASP.Net-MVC - Using jQuery QueryBuilder, DataTables, and dynamic-linq-query-builderDynamic Query Builder for ASP.Net-MVC - 使用 jQuery QueryBuilder、DataTables 和 dynamic-linq-query-builder
【发布时间】:2018-11-20 16:00:47
【问题描述】:

我正在尝试完成以下任务:

  1. 为 ASP.NET-MVC 创建可视化表达式/查询构建器。
  2. 将生成的查询传递给 DataTables。

这个问题是关于任务 1 的,因为那是我卡住的地方。我已发布任务 2 以提供更多背景信息。

为了完成任务 1,我使用了 jQuery QueryBuilder - 一个 jQuery 插件来创建用户友好的查询。在 QueryBuilder 网站的后端部分 (https://querybuilder.js.org/#backends) 下有一个 .NET 列表。他们建议使用 Castle-it (https://github.com/castle-it/dynamic-linq-query-builder) 的 dynamic-linq-query-builder。

这是我的问题:

dynamic-linq-query-builder 似乎都是用静态类构建的。我想从我的数据库中检索数据,但从我的在线研究中我无法在静态类中启动 dbcontext。

Dynamic-linq-query 提供了一个 PersonBuilder 类来反序列化 JSON 数据,它们包含一个 TestData 字符串:

 public static class PersonBuilder
            {
                public static List<PersonRecord> GetPeople()
                {
                    var result = new List<PersonRecord>();

                    var testData = TestData;

                    var personRecords = JsonConvert.DeserializeObject<List<PersonRecord>>(testData);

                    return personRecords;

                }

                private static string TestData
                {
                    get
                    {
                        return @"
                                [
            {
                ""FirstName"": ""Jane"",

                ""LastName"": ""Hansen"",
                ""Birthday"": ""1969-12-31T16:00:00-08:00"",
                ""Address"": ""P.O. Box 492, 4607 Tempus, Rd."",
                ""City"": ""Polatlı"",
                ""State"": ""Ankara"",
             ...
             ...
             ...

然后在 HomeController 中,他们使用以下内容过滤查询:

[HttpPost]
public JsonResult Index(FilterRule obj)
{
    var jsonSerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
    var people = PersonBuilder.GetPeople().BuildQuery(obj).ToList();

    return Json(people);


}

这里是他们的 QueryBuilder 实现和读出结果的 jQuery 逻辑。

  <script type="text/javascript">
    $(function() {
        // Handler for .ready() called.
        var tableData = [];

        var filterDefinition = @Html.Raw(ViewBag.FilterDefinition);
        var customFilters = {
            condition: 'AND',
            rules: []
        };
        var jqueryQueryBuilder = $('#jquery-query-builder');
        var jqueryQueryBuilderDom = jqueryQueryBuilder.queryBuilder({
            plugins: ['bt-tooltip-errors', 'filter-description'],
            //allow_groups: 0,
            allow_empty: true,
            filters: filterDefinition,
            rules: customFilters,
            icons: {
                add_group: 'fa fa-plus-square',
                add_rule: 'fa fa-plus-circle',
                remove_group: 'fa fa-minus-square',
                remove_rule: 'fa fa-minus-circle',
                error: 'fa fa-exclamation-triangle',
                sortable: 'fa fa-exclamation-triangle'
            }
        });

        var convertArraysToCommaDelimited = function(obj) {
            if (obj != null) {
                if (obj.hasOwnProperty("value")) {
                    if( Object.prototype.toString.call( obj.value ) === '[object Array]' ) {
                        obj.value = obj.value.join(", ");
                    }
                }
                if (obj.hasOwnProperty("rules") && obj.rules != null) {
                    for (var i = 0; i < obj.rules.length; i++) {
                        convertArraysToCommaDelimited(obj.rules[i]);
                    }
                }
            }
        }
        var getRules = function() {
            try {
                var res =  jqueryQueryBuilder.queryBuilder('getRules');
                convertArraysToCommaDelimited(res);
                return res;
            } catch (ex) {
                //console.log(ex);
                return null;
            }
        }

        var buildTable;
        var filterData = function() {

            $.ajax({
                type: 'POST',
                url: "../Home/Index",
                data: JSON.stringify(getRules()),
                success: function (returnPayload) {
                    tableData = returnPayload;
                    buildTable();
                    console && console.log ("request succeeded");
                },
                error: function (xhr, ajaxOptions, thrownError) {
                    console && console.log ("request failed");
                },
                dataType: "json",
                contentType: "application/json",            
                processData: false,
                async: true
            });
        }



        $('#applyFilter').on('click', function() {
            filterData();
        });
        buildTable = function() {
            var tbody = $('#data-table tbody'),
                props = ["FirstName", "LastName", "Birthday", "Age", "Address", "City", "State", "ZipCode"];
            tbody.empty();
            $.each(tableData, function(i, reservation) {
                var tr = $('<tr>');
                $.each(props, function(i, prop) {
                    $('<td>').html(reservation[prop]).appendTo(tr);  
                });
                tbody.append(tr);
            });
        };

        filterData();

    });

</script>

您会注意到他们创建了一个 buildTable 函数。稍后我想用 DataTable 实现替换它。

我的尝试:

我尝试在 PersonBuilder 类中使用 LINQ 启动 dbcontext。问题是这个类是静态的。我只是删除了 PersonBuilder 类的静态定义。这是我的实现:

public List<PersonRecord> GetPeople()
        {
            IQueryable<PersonRecord> query = DbContext.PersonRecord;


            var data = query.Select(asset => new Asset
            {
                data1 = PersonRecord.data1,
                data2 = PersonRecord.data2,
                ...
                ...

            }).ToList();

            return data;
        }

我遇到的问题是 HomeController 现在抛出以下错误:

CS0120:非静态字段需要对象引用, 方法或属性“成员”

在以下行:

var people = PersonBuilder.GetPeople().BuildQuery(obj).ToList();

不太清楚如何解决这个问题,因为似乎整个库都是用静态类构建的?

你们觉得呢?

【问题讨论】:

    标签: c# asp.net-mvc linq datatables jquery-query-builder


    【解决方案1】:

    主要问题是您将GetPeople() 定义为PersonBuilder 类中标记为static 的非静态方法。正如MSDN documentation 中所述,静态类必须只包含静态成员,包括静态方法(见原因here)。

    CS0120 error 表示您应该使用带有静态方法的静态类或非静态类的实例化构造函数作为对象。如果要使用非静态方法,该类不要标记为static,并且必须先实例化类构造函数才能访问该方法:

    public class PersonBuilder
    {
        public List<PersonRecord> GetPeople()
        {
            IQueryable<PersonRecord> query = DbContext.PersonRecord;
    
            var data = query.Select(asset => new Asset
            {
               data1 = PersonRecord.data1,
               data2 = PersonRecord.data2,
               // other stuff
    
            }).ToList();
    
            return data;
        }
    }
    

    用法

    [HttpPost]
    public JsonResult Index(FilterRule obj)
    {
        var jsonSerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
        var personBuilder = new PersonBuilder(); // add constructor initialization first
        var people = personBuilder.GetPeople().BuildQuery(obj).ToList();
    
        return Json(people);
    }
    

    相关问题:

    How shouldi avoid the CS0120 error in my code?

    【讨论】:

    • 你好,我将如何以通用方式处理这个问题,即如果我不知道我的 Person 类型并且只是试图将对象加载到构建器。具体来说,我有 CSV 文件正在加载并转换为 List。另一个问题,我可以从用户那里access the linq query Posted back
    猜你喜欢
    • 2011-02-04
    • 2017-12-02
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2015-06-15
    • 2019-08-11
    • 2015-12-21
    相关资源
    最近更新 更多