第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

綁定復(fù)雜類型對象列表的問題 - Dotnet Core 2.1 Razor Pages

綁定復(fù)雜類型對象列表的問題 - Dotnet Core 2.1 Razor Pages

C#
慕尼黑8549860 2022-06-19 09:49:10
我在 dotnet core 2.1 上為我的項(xiàng)目使用 Razor 頁面,應(yīng)用程序似乎沒有正確綁定我的屬性,簡單類型(int 和 string 類型)正確綁定但不是復(fù)雜類型列表,有沒有工作為了這個?我的頁面處理程序如下所示:public async Task<IActionResult> OnGetDTResponseAsync(DataTableOptions options) {// Some Code}當(dāng)我使用調(diào)試器逐步完成時,“DataTableOptions 選項(xiàng)”的所有簡單類型屬性都填充得很好,但復(fù)雜類型返回 null。我的模型看起來像這樣:public class DataTableOptions{    public string Draw { get; set; }    public int Start { get; set; }    public int Length { get; set; }    public List<DataTableColumnOrder> Order { get; set; }    public List<DataTableColumn> Columns { get; set; }    public DataTableColumnSearch Search { get; set; }    public List<string> Params { get; set; }    public DataTableOptions() { }    public class DataTableColumn    {        public string Data { get; set; }        public string Name { get; set; }        public bool Searchable { get; set; }        public bool Orderable { get; set; }        public DataTableColumnSearch Search { get; set; }        public DataTableColumn() { }    }    public class DataTableColumnSearch    {        public string Value { get; set; }        public bool Regex { get; set; }        public DataTableColumnSearch() { }    }    public class DataTableColumnOrder    {        public int Column { get; set; }        public string Dir { get; set; }        public DataTableColumnOrder() { }    }}在嘗試解決此問題時,我嘗試使用public async Task<IActionResult> OnGetDTResponseAsync(List<Dictionary<string, string>> columns)在我的頁面處理程序中代替 DataTableOptions 的 columns 屬性,所以我可以手動將屬性綁定到我的類:我得到了我的列的完整列表,它的屬性綁定到它,除了 DataTableColumn 的 DataTableColumnSearch 屬性,它也是一個復(fù)雜類型結(jié)果為空。public async Task<IActionResult> OnGetDTResponseAsync(List<Dictionary<string, object>> columns) 也不行。這是 fiddler 中請求的樣子:GET /CMS/Index?handler=DTResponse&draw=1&columns%5B0%5D%5Bdata%5D=id&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=false&columns%5B0%5D%5Borderable%5D= false&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=名稱&columns%5B1%5D%5Bname%5D=&columns% 
查看完整描述

1 回答

?
牧羊人nacy

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個贊

我必須構(gòu)建一個自定義模型綁定類來處理這種情況。出于某種原因,具有另一個復(fù)雜對象作為其屬性的一部分的復(fù)雜對象的集合列表無法在核心 2.1 -Razor 頁面中自動正確綁定。


請參閱下面的解決方案:


using Microsoft.AspNetCore.Mvc.ModelBinding;

using RestaurantDataModel.Data.Requests;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;


namespace ExampleDataModel.Data

{

public class CustomDataTableEntityBinder : IModelBinder

{

    public Task BindModelAsync(ModelBindingContext bindingContext)

    {

        if (bindingContext == null)

        {

            throw new ArgumentNullException(nameof(bindingContext));

        }


        var allValues = bindingContext.HttpContext.Request.Query;

        DataTableOptions DTOs = new DataTableOptions {

            Draw = allValues.FirstOrDefault(a => a.Key == "draw").Value,

            Start = Convert.ToInt32(allValues.FirstOrDefault(a => a.Key == "start").Value),

            Length = Convert.ToInt32(allValues.FirstOrDefault(a => a.Key == "length").Value)

        };


        if (allValues.Any(a => a.Key.Length > 9 && a.Key.Substring(0, 9).Contains("columns")))

        {

            var myListIndex = 0;

            var myListIndexComparer = 0;

            var allColumns = allValues.Where(a => a.Key.Length > 9 && a.Key.Substring(0, 9).Contains("columns")).ToList();

            DataTableColumn DTC = new DataTableColumn();

            DataTableColumnSearch DTCS = new DataTableColumnSearch();

            DTOs.columns = new List<DataTableColumn>();

            foreach (var column in allColumns)

            {

                var perColumnArray = column.Key.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);

                var rawIndex = perColumnArray[1];


                if (!int.TryParse(rawIndex, out myListIndex))

                {

                    return Task.CompletedTask;

                }


                if (myListIndexComparer != myListIndex)

                {

                    DTC.search = DTCS;

                    DTOs.columns.Add(DTC);

                    DTC = new DataTableColumn();

                    DTCS = new DataTableColumnSearch();

                }

                myListIndexComparer = myListIndex;

                switch (perColumnArray[2])

                {

                    case "data":

                        DTC.data = column.Value;

                        break;

                    case "name":

                        DTC.name = column.Value;

                        break;

                    case "searchable":

                        DTC.searchable = String.IsNullOrWhiteSpace(column.Value) ? false : Convert.ToBoolean(column.Value);

                        break;

                    case "orderable":

                        DTC.orderable = String.IsNullOrWhiteSpace(column.Value) ? false : Convert.ToBoolean(column.Value);

                        break;

                    case "search":

                        if (perColumnArray[3] == "regex")

                        {

                            DTCS.regex = String.IsNullOrWhiteSpace(column.Value) ? false : Convert.ToBoolean(column.Value);

                        }

                        if (perColumnArray[3] == "value")

                        {

                            DTCS.value = column.Value;

                        }

                        break;

                }


                if(allColumns.IndexOf(column) == allColumns.IndexOf(allColumns.Last()))

                {

                    DTC.search = DTCS;

                    DTOs.columns.Add(DTC);

                }

            }

        }

        if (allValues.Any(a => a.Key.Length > 7 && a.Key.Substring(0, 7).Contains("order")))

        {

            var myListIndex = 0;

            var myListIndexComparer = 0;

            var allOrders = allValues.Where(a => a.Key.Length > 7 && a.Key.Substring(0, 7).Contains("order")).ToList();

            DataTableColumnOrder DTCO = new DataTableColumnOrder();

            DTOs.order = new List<DataTableColumnOrder>();

            foreach (var order in allOrders)

            {

                var perColumnArray = order.Key.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);

                var rawIndex = perColumnArray[1];


                if (!int.TryParse(rawIndex, out myListIndex))

                {

                    return Task.CompletedTask;

                }


                if (myListIndexComparer != myListIndex)

                {

                    DTOs.order.Add(DTCO);

                    DTCO = new DataTableColumnOrder();

                }

                myListIndexComparer = myListIndex;

                switch (perColumnArray[2])

                {

                    case "column":

                        DTCO.Column = Convert.ToInt32(order.Value);

                        break;

                    case "dir":

                        DTCO.Dir = order.Value;

                        break;

                }

                if(allOrders.IndexOf(order) == allOrders.IndexOf(allOrders.Last()))

                {

                    DTOs.order.Add(DTCO);

                }

            }

        }

        if (allValues.Any(a => a.Key.Length > 7 && a.Key.Substring(0, 8).Contains("search")))

        {

            var allSearches = allValues.Where(a => a.Key.Length > 8 && a.Key.Substring(0, 8).Contains("search")).ToList();

            DataTableColumnSearch DTCS = new DataTableColumnSearch();

            DTOs.search = new DataTableColumnSearch();

            foreach (var search in allSearches)

            {

                var perColumnArray = search.Key.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);


                switch (perColumnArray[1])

                {

                    case "value":

                        DTCS.value = search.Value;

                        break;

                    case "regex":

                        DTCS.regex = String.IsNullOrWhiteSpace(search.Value) ? false : Convert.ToBoolean(search.Value);

                        break;

                }

                if(allSearches.IndexOf(search) == allSearches.IndexOf(allSearches.Last()))

                {

                    DTOs.search = DTCS;

                }

            }

        }


        bindingContext.Result = ModelBindingResult.Success(DTOs);

        return Task.CompletedTask;

    }

}


}

然后我將它添加到我的模型類的頂部:


[ModelBinder(BinderType = typeof(CustomDataTableEntityBinder))]


查看完整回答
反對 回復(fù) 2022-06-19
  • 1 回答
  • 0 關(guān)注
  • 127 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號