Web API 2调用复杂类型构造函数



我是Web API的新手,我正试图将其集成到我正在研究的项目中。

我将一个复杂的类型发送给WebApi操作,但是当我这样做时,它调用我的类型构造函数,这最终会覆盖我发送给该方法的值。

这正常吗?我在fiddler中看到了实际值,我想在反序列化对象时保留这些值。我应该用别的方法来实现这个目标吗?任何帮助或知识将非常感激!谢谢!:)

这是我的班级:

public class PageOptions
{
    public List<ControlOption<MacroDataType>> DataTypeOptions { get; set; }
    public List<ControlOption<string>> FcastSourceOptions { get; set; }
    public ModalOptions<CorpRegionFilter, CorpRegionSort> CorpCodeOptions { get; set; }
    public ModalOptions<EmptyFilter, EmptySort> BusinessLineOptions { get; set; }
    public ModalOptions<EmptyFilter, EmptySort> SubCategoryOptions { get; set; }
    public List<ControlOption<string>> RollingMonthOptions { get; set; }
    public List<ModalSelection<BusLineInfo>> AddBusinessLineOptions { get; set; }
    public List<ControlOption<AxisDates>> AxisDateOptions { get; set; }
    public List<ControlOption<GraphOptions>> GraphOptionsOptions { get; set; }
    public List<MacroLineOptions> MacroLines { get; set; }
    public List<MacroNote> MacroNotes { get; set; }
    public List<CompareLineOptions> CompareLines { get; set; }
    public Boolean CompareAllToOne { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public GraphStyles GraphStyle { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public CalendarStyles CalendarStyle { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public AxisDates AxisDate { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    public LineCompareType ComparisonType { get; set; }
    public String Title { get; set; }
    public String SubTitle { get; set; }
    public Boolean ScaleResults { get; set; }
    public Boolean ShowTabulation { get; set; }
    public Boolean ThickLines { get; set; }
    public Boolean BrowseByCorp { get; set; }
    public Boolean ShowUserName { get; set; }
    public Boolean PrintLargeFont { get; set; }
    public Boolean Enable3D { get; set; }
    public Boolean Launch { get; set; }
    public Boolean Promotion { get; set; }
    public Boolean PriceEIChange { get; set; }
    public Boolean LocalEvent { get; set; }
    public Boolean Miscellaneous { get; set; }
    public BrowseByCorpData BrowseByCorpData { get; set; }
    public List<List<string>> LineColors { get; set; }
    public String NativeId { get; set; }
    public String FullUserName { get; set; }
    public MacroLineOptions DefaultLineConfig { get; set; }
    public List<List<string>> DefaultLineColors { get; set; }
    public LineFormStates FormStates { get; set; }
    public int CurrentLineIndex { get; set; }
    public String ChartImageURI { get; set; }
    public PageOptions()
    {
        TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;
        // Current User Id
        NativeId = HttpContext.Current.User.Identity.Name;
        using (var client = new MacroDataServiceClient())
        {
            FullUserName = client.GetUsersFullName(NativeId);
        }
        // Add the Lines
        MacroLines = new List<MacroLineOptions>();
        MacroLines.Add(new MacroLineOptions() { LineId = 1, Description = "Line 1" });
        MacroLines.Add(new MacroLineOptions() { LineId = 2, Description = "Line 2" });
        MacroLines.Add(new MacroLineOptions() { LineId = 3, Description = "Line 3" });
        MacroLines.Add(new MacroLineOptions() { LineId = 4, Description = "Line 4" });
        MacroLines.Add(new MacroLineOptions() { LineId = 5, Description = "Line 5" });
        MacroLines.Add(new MacroLineOptions() { LineId = 6, Description = "Line 6" });
        MacroLines.Add(new MacroLineOptions() { LineId = 7, Description = "Line 7" });
        MacroLines.Add(new MacroLineOptions() { LineId = 8, Description = "Line 8" });
        MacroLines.Add(new MacroLineOptions() { LineId = 9, Description = "Line 9" });
        MacroLines.Add(new MacroLineOptions() { LineId = 10, Description = "Line 10" });
        DefaultLineConfig = new MacroLineOptions() { LineId = 1, Description = "" };
        // Add Business Line Options
        AddBusinessLineOptions = new List<ModalSelection<BusLineInfo>>();
        using (var client = new MacroDataServiceClient())
        {
            client.GetAllBusinessLineData()
                .Where(x => x.BusLnCd == "A64" || x.BusLnCd == "A08" || x.BusLnCd == "A54" || x.BusLnCd == "A85" || x.BusLnCd == "A09")
                .ToList()
                .ForEach(x =>
                {
                    AddBusinessLineOptions.Add(new ModalSelection<BusLineInfo>() { Description = textInfo.ToTitleCase(x.BusLnNm.ToLower()), Selections = new List<BusLineInfo>() { new BusLineInfo() { Code = x.BusLnCd, Name = textInfo.ToTitleCase(x.BusLnNm.ToLower()) } } });
                });
        }
        // DATATYPES
        DataTypeOptions = new List<ControlOption<MacroDataType>>();
        using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate())
        using (var client = new MacroDataServiceClient())
        {
            client.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
            var sales = client.GetFilteredMacroDataTypes(MacroDataTypeSection.Sales).Select(x => new ControlOption<MacroDataType>(x.DataType, x.DisplayName, "Sales")).ToList();
            var recruiting = client.GetFilteredMacroDataTypes(MacroDataTypeSection.Recruiting).Select(x => new ControlOption<MacroDataType>(x.DataType, x.DisplayName, "Distributor Force")).ToList();
            var other = client.GetFilteredMacroDataTypes(MacroDataTypeSection.Other).Select(x => new ControlOption<MacroDataType>(x.DataType, x.DisplayName, "Other")).ToList();
            var daily = client.GetFilteredMacroDataTypes(MacroDataTypeSection.Daily).Select(x => new ControlOption<MacroDataType>(x.DataType, x.DisplayName, "Daily")).ToList();
            DataTypeOptions.Add(new ControlOption<MacroDataType>(MacroDataType.NoSelection, "No Selection"));
            DataTypeOptions.AddRange(sales);
            DataTypeOptions.AddRange(recruiting);
            DataTypeOptions.AddRange(other);
            DataTypeOptions.AddRange(daily);
        }
        // FCAST SOURCE
        FcastSourceOptions = new List<ControlOption<string>>();
        FcastSourceOptions.Add(new ControlOption<string>("00", "Current Fcst"));
        int count = 1;
        for (var date = DateTime.Now.AddMonths(-1); date >= DateTime.Now.AddMonths(-61); date = date.AddMonths(-1))
        {
            var strVal = String.Format("{0:00}", count++);
            var strText = String.Format("{0:00}/{1} EOM Fcst", date.Month, date.Year);
            FcastSourceOptions.Add(new ControlOption<string>(strVal, strText));
        }
        // CORP CODES
        CorpCodeOptions = new ModalOptions<CorpRegionFilter, CorpRegionSort>();
        CorpCodeOptions.SortList.Add(new ModalDropdownOption { Selected = false, Text = "Corp Code", Value = (int)CorpRegionSort.CorpCode });
        CorpCodeOptions.SortList.Add(new ModalDropdownOption { Selected = false, Text = "Corp Name", Value = (int)CorpRegionSort.CorpName });
        CorpCodeOptions.SortList.Add(new ModalDropdownOption { Selected = false, Text = "Region/Corp Code", Value = (int)CorpRegionSort.RegionCorpCode });
        CorpCodeOptions.SortList.Add(new ModalDropdownOption { Selected = false, Text = "Region/Corp Name", Value = (int)CorpRegionSort.RegionCorpName });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "status", Selected = false, Text = "All", Value = (int)CorpRegionFilter.AllStatus, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "status", Selected = true, Text = "Active", Value = (int)CorpRegionFilter.ActiveStatus, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "status", Selected = false, Text = "Planned", Value = (int)CorpRegionFilter.PlannedStatus, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "region", Selected = true, Text = "All", Value = (int)CorpRegionFilter.AllRegion, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "region", Selected = false, Text = "AAP", Value = (int)CorpRegionFilter.AAPRegion, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "region", Selected = false, Text = "AJL", Value = (int)CorpRegionFilter.AJLRegion, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "region", Selected = false, Text = "EU", Value = (int)CorpRegionFilter.EURegion, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "region", Selected = false, Text = "NABR", Value = (int)CorpRegionFilter.NABRRegion, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Group = "region", Selected = false, Text = "US", Value = (int)CorpRegionFilter.USRegion, OptionType = "radio" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Selected = false, Text = "Catalog", Value = (int)CorpRegionFilter.Catalog, OptionType = "checkbox" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { Selected = false, Text = "Other", Value = (int)CorpRegionFilter.Other, OptionType = "checkbox" });
        CorpCodeOptions.FilterList.Add(new ModalDropdownOption { });
        CorpCodeOptions.SelectedSort = CorpRegionSort.RegionCorpCode;
        // BUSINESS LINES
        BusinessLineOptions = new ModalOptions<EmptyFilter, EmptySort>();
        // Add filters/Sorts here
        // SUBCAT
        SubCategoryOptions = new ModalOptions<EmptyFilter, EmptySort>();
        // Add filters/Sorts here
        // ROLLING MONTHS
        RollingMonthOptions = new List<ControlOption<string>>();
        RollingMonthOptions.Add(new ControlOption<string>("1", "1 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("2", "2 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("3", "3 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("4", "4 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("5", "6 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("7", "7 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("8", "8 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("9", "9 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("10", "10 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("11", "11 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("12", "12 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("18", "18 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("24", "24 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("36", "36 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("48", "48 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("60", "60 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("72", "72 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("84", "84 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("96", "96 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("108", "108 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("120", "120 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("132", "132 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("144", "144 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("156", "156 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("168", "168 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("180", "180 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("192", "192 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("204", "204 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("216", "216 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("228", "228 Month"));
        RollingMonthOptions.Add(new ControlOption<string>("240", "240 Month"));
        // MACRO NOTES
        MacroNotes = new List<MacroNote>();
        GraphOptionsOptions = new List<ControlOption<GraphOptions>>();
        GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.ShowTabulation, "Show Tabulation", null, GraphOptions.ShowTabulation.ToString()));
        GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.ThickLines, "Thick Lines", null, GraphOptions.ThickLines.ToString()));
        GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.BrowseByCorp, "Browse By Corp", null, GraphOptions.BrowseByCorp.ToString()));
        GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.ShowUserName, "Show User Name", null, GraphOptions.ShowUserName.ToString()));
        //GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.ShowNotes, "Show Notes", null, GraphOptions.ShowNotes.ToString()));
        //GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.PrintLargeFont, "Print Large Font", null, GraphOptions.PrintLargeFont.ToString()));
        //GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.Enable3D, "Enable 3D", null, GraphOptions.Enable3D.ToString()));
        GraphOptionsOptions.Add(new ControlOption<GraphOptions>(GraphOptions.ScaleResults, "Scale Results", null, GraphOptions.ScaleResults.ToString()));
        // Add the maximum number of comparison lines
        CompareLines = new List<CompareLineOptions>();
        CompareLines.Add(new CompareLineOptions());
        CompareLines.Add(new CompareLineOptions());
        CompareLines.Add(new CompareLineOptions());
        CompareLines.Add(new CompareLineOptions());
        CompareLines.Add(new CompareLineOptions());
        LineColors = new List<List<String>>() { new List<String>() { "#3366cc", "#dc3912", "#ff9900", "#109618" }, new List<String>() { "#990099", "#0099c6", "#dd4477", "#66aa00" }, new List<String>() { "#b82e2e", "#316395" } };
        DefaultLineColors = LineColors;
        // Add other options
        FormStates = new LineFormStates();
        GraphStyle = GraphStyles.Trend;
        CalendarStyle = CalendarStyles.Calendar;
        ComparisonType = LineCompareType.None;
        ShowTabulation = true;
        ThickLines = true;
        ShowUserName = true;
        PrintLargeFont = true;
        Enable3D = true;
        ScaleResults = true;
        CurrentLineIndex = 0;
        BrowseByCorpData = new BrowseByCorpData() { BrowseByCorpList = new List<CorpInfo>(), SelectedCorp = new CorpInfo() };

    }
}
这是我的Post方法:
[HttpPost]
[ActionName("SimplePost")]
public void PostPageOptions([FromBody] PageOptions value)
{
}

就像我提到的,我的fiddler显示正确的值,但它似乎调用我的构造函数,它使用我的初始化值,而不是在Web API方法。

可能是我的班级太大了吗?当我使用较小的类时,它似乎有效。

这是正常的。当你将一个复杂类型传递给web api时,这个对象实际上被api控制器作为字符串读取,并被序列化成由签名确定的正确对象。但是要做到这一点,需要调用类的基构造函数,因此在您的示例中,调用无参数构造函数,然后控制器尝试填充在对象的sting表示中传递的属性。基本上要解决这个问题,你需要有一个基本的无参数构造函数,它没有初始化值

最新更新