[{"data":1,"prerenderedAt":1120},["ShallowReactive",2],{"blog:2018:comma-separated-parameters-webapi":3,"blogMore-Development":1106,"comments-comma-separated-parameters-webapi":1119},{"id":4,"title":5,"body":6,"category":1088,"commentCount":34,"date":1089,"description":1090,"excerpt":1091,"extension":1092,"filenames":1093,"hidden":1094,"image":1093,"meta":1095,"minutes":124,"navigation":342,"path":1096,"seo":1097,"showCategory":1093,"stem":1098,"tags":1099,"updated":1093,"url":1103,"wordCount":1104,"__hash__":1105},"content\u002Fblog\u002F2018\u002Fcomma-separated-parameters-webapi.md","Comma-separated parameter values in WebAPI",{"type":7,"value":8,"toc":1084},"minimark",[9,18,21,134,149,152,155,164,190,195,206,209,976,980,987,1074,1080],[10,11,12,13,17],"p",{},"The model binding mechanism in ASP.NET is slick - it's highly extensible and built on ",[14,15,16],"code",{},"TypeDescriptor"," for re-use that lets you avoid writing boilerplate code to map between CLR objects and their web representations.",[10,19,20],{},"One surprise, however, is that out of the box, neither WebAPI nor MVC support comma-separated parameter values when bound to an array, e.g.",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-csharp shiki shiki-themes everforest-light dracula","public class MyController : Controller {\n    public string Page([FromUri]int[] ids) {\n        return String.Join(\" ; \", ids);\n    }\n}\n","csharp","",[14,29,30,58,94,122,128],{"__ignoreMap":27},[31,32,35,39,43,47,51,55],"span",{"class":33,"line":34},"line",1,[31,36,38],{"class":37},"s9HRq","public",[31,40,42],{"class":41},"smiwp"," class",[31,44,46],{"class":45},"sPLAf"," MyController",[31,48,50],{"class":49},"s6Vpi"," : ",[31,52,54],{"class":53},"snuxY","Controller",[31,56,57],{"class":49}," {\n",[31,59,61,64,68,72,75,78,81,84,87,91],{"class":33,"line":60},2,[31,62,63],{"class":37},"    public",[31,65,67],{"class":66},"sXAHl"," string",[31,69,71],{"class":70},"sS4Kt"," Page",[31,73,74],{"class":49},"([",[31,76,77],{"class":53},"FromUri",[31,79,80],{"class":49},"]",[31,82,83],{"class":66},"int",[31,85,86],{"class":49},"[] ",[31,88,90],{"class":89},"s7cAX","ids",[31,92,93],{"class":49},") {\n",[31,95,97,100,103,106,109,113,117,119],{"class":33,"line":96},3,[31,98,99],{"class":41},"        return",[31,101,102],{"class":49}," String.",[31,104,105],{"class":70},"Join",[31,107,108],{"class":49},"(",[31,110,112],{"class":111},"sciFF","\"",[31,114,116],{"class":115},"sJQOs"," ; ",[31,118,112],{"class":111},[31,120,121],{"class":49},", ids);\n",[31,123,125],{"class":33,"line":124},4,[31,126,127],{"class":49},"    }\n",[31,129,131],{"class":33,"line":130},5,[31,132,133],{"class":49},"}\n",[10,135,136,137,140,141,144,145,148],{},"Will only return ",[14,138,139],{},"1 ; 2 ; 3"," when supplied with ",[14,142,143],{},"\u002Fmy\u002Fpage?ids=1&ids=2&ids=3"," and if you instead give it ",[14,146,147],{},"\u002Fmy\u002Fpage?ids=1,2,3"," it will fail.",[10,150,151],{},"The reason was likely because there is no standard for this at all and that the former - supported - scenario maps to what forms do when they post multiple value selections such as that in a select list box. The latter is much more readable and is expected by some client frameworks and supported by some other web frameworks such as the Java Spring MVC framework.",[10,153,154],{},"Naturally, that extensible system lets us easily extend this behaviour. We can support both transparently - and interestingly enough - even mix-and-match on the same URL. So for example;",[10,156,157,160,161,163],{},[14,158,159],{},"\u002Fmy\u002Fpage?ids=1,2&ids=3"," will now return ",[14,162,139],{}," in our example.",[165,166,167],"blockquote",{},[10,168,169,170,173,174,178,179,182,183,186,187],{},"Although this supports both types if you are currently using commas in your number format this would break your app. e.g. ",[14,171,172],{},"?ids=1,200&ids=3,500"," would have been ",[175,176,177],"strong",{},"correctly"," received as ",[14,180,181],{},"1200, 500"," but now would be ",[175,184,185],{},"incorrectly received"," as ",[14,188,189],{},"1, 200, 3, 500",[191,192,194],"h2",{"id":193},"commaseparatedarraymodelbinder-class","CommaSeparatedArrayModelBinder class",[10,196,197,198,205],{},"My ",[199,200,204],"a",{"href":201,"rel":202},"https:\u002F\u002Fgithub.com\u002Fdamieng\u002FDamienGKit\u002Fblob\u002Fmaster\u002FCSharp\u002FDamienG.Library\u002FWeb\u002FCommaSeparatedArrayModelBinder.cs",[203],"nofollow","DamienGKit project"," contains the source but, I'll also present it here.",[10,207,208],{},"Out of the box, this supports integer types and GUIDs and could be extended for floats and decimals, but just be careful with that formatting!",[22,210,212],{"className":24,"code":211,"language":26,"meta":27,"style":27},"public class CommaSeparatedArrayModelBinder : IModelBinder {\n    private static readonly Type[] supportedElementTypes = {\n        typeof(int), typeof(long), typeof(short), typeof(byte),\n        typeof(uint), typeof(ulong), typeof(ushort), typeof(Guid)\n    };\n\n    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) {\n        if (!IsSupportedModelType(bindingContext.ModelType)) return false;\n        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);\n        var stringArray = valueProviderResult?.AttemptedValue\n            ?.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);\n        if (stringArray == null) return false;\n        var elementType = bindingContext.ModelType.GetElementType();\n        if (elementType == null) return false;\n\n        bindingContext.Model = CopyAndConvertArray(stringArray, elementType);\n        return true;\n    }\n\n    private static Array CopyAndConvertArray(IReadOnlyList\u003Cstring> sourceArray, Type elementType) {\n        var targetArray = Array.CreateInstance(elementType, sourceArray.Count);\n        if (sourceArray.Count > 0) {\n            var converter = TypeDescriptor.GetConverter(elementType);\n            for (var i = 0; i \u003C sourceArray.Count; i++)\n                targetArray.SetValue(converter.ConvertFromString(sourceArray[i]), i);\n        }\n        return targetArray;\n    }\n\n    internal static bool IsSupportedModelType(Type modelType) {\n        return modelType.IsArray && modelType.GetArrayRank() == 1\n                && modelType.HasElementType\n                && supportedElementTypes.Contains(modelType.GetElementType());\n    }\n\n}\n\npublic class CommaSeparatedArrayModelBinderProvider : ModelBinderProvider {\n    public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType) {\n        return CommaSeparatedArrayModelBinder.IsSupportedModelType(modelType)\n            ? new CommaSeparatedArrayModelBinder() : null;\n    }\n}\n",[14,213,214,230,252,293,332,337,344,374,409,440,461,497,520,542,562,567,585,595,600,605,644,668,686,706,742,764,770,778,783,788,810,837,848,867,872,877,882,887,904,934,947,966,971],{"__ignoreMap":27},[31,215,216,218,220,223,225,228],{"class":33,"line":34},[31,217,38],{"class":37},[31,219,42],{"class":41},[31,221,222],{"class":45}," CommaSeparatedArrayModelBinder",[31,224,50],{"class":49},[31,226,227],{"class":53},"IModelBinder",[31,229,57],{"class":49},[31,231,232,235,238,241,244,247,250],{"class":33,"line":60},[31,233,234],{"class":37},"    private",[31,236,237],{"class":37}," static",[31,239,240],{"class":37}," readonly",[31,242,243],{"class":53}," Type",[31,245,246],{"class":49},"[] supportedElementTypes ",[31,248,249],{"class":37},"=",[31,251,57],{"class":49},[31,253,254,257,259,261,264,267,269,272,274,276,278,281,283,285,287,290],{"class":33,"line":96},[31,255,256],{"class":41},"        typeof",[31,258,108],{"class":49},[31,260,83],{"class":66},[31,262,263],{"class":49},"), ",[31,265,266],{"class":41},"typeof",[31,268,108],{"class":49},[31,270,271],{"class":66},"long",[31,273,263],{"class":49},[31,275,266],{"class":41},[31,277,108],{"class":49},[31,279,280],{"class":66},"short",[31,282,263],{"class":49},[31,284,266],{"class":41},[31,286,108],{"class":49},[31,288,289],{"class":66},"byte",[31,291,292],{"class":49},"),\n",[31,294,295,297,299,302,304,306,308,311,313,315,317,320,322,324,326,329],{"class":33,"line":124},[31,296,256],{"class":41},[31,298,108],{"class":49},[31,300,301],{"class":66},"uint",[31,303,263],{"class":49},[31,305,266],{"class":41},[31,307,108],{"class":49},[31,309,310],{"class":66},"ulong",[31,312,263],{"class":49},[31,314,266],{"class":41},[31,316,108],{"class":49},[31,318,319],{"class":66},"ushort",[31,321,263],{"class":49},[31,323,266],{"class":41},[31,325,108],{"class":49},[31,327,328],{"class":53},"Guid",[31,330,331],{"class":49},")\n",[31,333,334],{"class":33,"line":130},[31,335,336],{"class":49},"    };\n",[31,338,340],{"class":33,"line":339},6,[31,341,343],{"emptyLinePlaceholder":342},true,"\n",[31,345,347,349,352,355,357,360,363,366,369,372],{"class":33,"line":346},7,[31,348,63],{"class":37},[31,350,351],{"class":66}," bool",[31,353,354],{"class":70}," BindModel",[31,356,108],{"class":49},[31,358,359],{"class":53},"HttpActionContext",[31,361,362],{"class":89}," actionContext",[31,364,365],{"class":49},", ",[31,367,368],{"class":53},"ModelBindingContext",[31,370,371],{"class":89}," bindingContext",[31,373,93],{"class":49},[31,375,377,380,383,386,389,392,396,399,402,406],{"class":33,"line":376},8,[31,378,379],{"class":41},"        if",[31,381,382],{"class":49}," (",[31,384,385],{"class":37},"!",[31,387,388],{"class":70},"IsSupportedModelType",[31,390,391],{"class":49},"(bindingContext.",[31,393,395],{"class":394},"sSKRk","ModelType",[31,397,398],{"class":49},")) ",[31,400,401],{"class":41},"return",[31,403,405],{"class":404},"s3Ipq"," false",[31,407,408],{"class":49},";\n",[31,410,412,415,418,420,423,426,429,432,434,437],{"class":33,"line":411},9,[31,413,414],{"class":66},"        var",[31,416,417],{"class":49}," valueProviderResult ",[31,419,249],{"class":37},[31,421,422],{"class":49}," bindingContext.",[31,424,425],{"class":394},"ValueProvider",[31,427,428],{"class":49},".",[31,430,431],{"class":70},"GetValue",[31,433,391],{"class":49},[31,435,436],{"class":394},"ModelName",[31,438,439],{"class":49},");\n",[31,441,443,445,448,450,453,456,458],{"class":33,"line":442},10,[31,444,414],{"class":66},[31,446,447],{"class":49}," stringArray ",[31,449,249],{"class":37},[31,451,452],{"class":49}," valueProviderResult",[31,454,455],{"class":37},"?",[31,457,428],{"class":49},[31,459,460],{"class":394},"AttemptedValue\n",[31,462,464,467,469,472,474,477,480,484,487,489,492,495],{"class":33,"line":463},11,[31,465,466],{"class":37},"            ?",[31,468,428],{"class":49},[31,470,471],{"class":70},"Split",[31,473,108],{"class":49},[31,475,476],{"class":41},"new",[31,478,479],{"class":49},"[] { ",[31,481,483],{"class":482},"sFDqs","'",[31,485,486],{"class":115},",",[31,488,483],{"class":482},[31,490,491],{"class":49}," }, StringSplitOptions.",[31,493,494],{"class":394},"RemoveEmptyEntries",[31,496,439],{"class":49},[31,498,500,502,505,508,511,514,516,518],{"class":33,"line":499},12,[31,501,379],{"class":41},[31,503,504],{"class":49}," (stringArray ",[31,506,507],{"class":37},"==",[31,509,510],{"class":404}," null",[31,512,513],{"class":49},") ",[31,515,401],{"class":41},[31,517,405],{"class":404},[31,519,408],{"class":49},[31,521,523,525,528,530,532,534,536,539],{"class":33,"line":522},13,[31,524,414],{"class":66},[31,526,527],{"class":49}," elementType ",[31,529,249],{"class":37},[31,531,422],{"class":49},[31,533,395],{"class":394},[31,535,428],{"class":49},[31,537,538],{"class":70},"GetElementType",[31,540,541],{"class":49},"();\n",[31,543,545,547,550,552,554,556,558,560],{"class":33,"line":544},14,[31,546,379],{"class":41},[31,548,549],{"class":49}," (elementType ",[31,551,507],{"class":37},[31,553,510],{"class":404},[31,555,513],{"class":49},[31,557,401],{"class":41},[31,559,405],{"class":404},[31,561,408],{"class":49},[31,563,565],{"class":33,"line":564},15,[31,566,343],{"emptyLinePlaceholder":342},[31,568,570,573,576,579,582],{"class":33,"line":569},16,[31,571,572],{"class":49},"        bindingContext.",[31,574,575],{"class":394},"Model",[31,577,578],{"class":37}," =",[31,580,581],{"class":70}," CopyAndConvertArray",[31,583,584],{"class":49},"(stringArray, elementType);\n",[31,586,588,590,593],{"class":33,"line":587},17,[31,589,99],{"class":41},[31,591,592],{"class":404}," true",[31,594,408],{"class":49},[31,596,598],{"class":33,"line":597},18,[31,599,127],{"class":49},[31,601,603],{"class":33,"line":602},19,[31,604,343],{"emptyLinePlaceholder":342},[31,606,608,610,612,615,617,619,622,625,628,631,634,636,639,642],{"class":33,"line":607},20,[31,609,234],{"class":37},[31,611,237],{"class":37},[31,613,614],{"class":53}," Array",[31,616,581],{"class":70},[31,618,108],{"class":49},[31,620,621],{"class":53},"IReadOnlyList",[31,623,624],{"class":49},"\u003C",[31,626,627],{"class":66},"string",[31,629,630],{"class":49},"> ",[31,632,633],{"class":89},"sourceArray",[31,635,365],{"class":49},[31,637,638],{"class":53},"Type",[31,640,641],{"class":89}," elementType",[31,643,93],{"class":49},[31,645,647,649,652,654,657,660,663,666],{"class":33,"line":646},21,[31,648,414],{"class":66},[31,650,651],{"class":49}," targetArray ",[31,653,249],{"class":37},[31,655,656],{"class":49}," Array.",[31,658,659],{"class":70},"CreateInstance",[31,661,662],{"class":49},"(elementType, sourceArray.",[31,664,665],{"class":394},"Count",[31,667,439],{"class":49},[31,669,671,673,676,678,681,684],{"class":33,"line":670},22,[31,672,379],{"class":41},[31,674,675],{"class":49}," (sourceArray.",[31,677,665],{"class":394},[31,679,680],{"class":37}," >",[31,682,683],{"class":404}," 0",[31,685,93],{"class":49},[31,687,689,692,695,697,700,703],{"class":33,"line":688},23,[31,690,691],{"class":66},"            var",[31,693,694],{"class":49}," converter ",[31,696,249],{"class":37},[31,698,699],{"class":49}," TypeDescriptor.",[31,701,702],{"class":70},"GetConverter",[31,704,705],{"class":49},"(elementType);\n",[31,707,709,712,714,717,720,722,724,727,729,732,734,737,740],{"class":33,"line":708},24,[31,710,711],{"class":41},"            for",[31,713,382],{"class":49},[31,715,716],{"class":66},"var",[31,718,719],{"class":49}," i ",[31,721,249],{"class":37},[31,723,683],{"class":404},[31,725,726],{"class":49},"; i ",[31,728,624],{"class":37},[31,730,731],{"class":49}," sourceArray.",[31,733,665],{"class":394},[31,735,736],{"class":49},"; i",[31,738,739],{"class":37},"++",[31,741,331],{"class":49},[31,743,745,748,751,754,757,759,761],{"class":33,"line":744},25,[31,746,747],{"class":49},"                targetArray.",[31,749,750],{"class":70},"SetValue",[31,752,753],{"class":49},"(converter.",[31,755,756],{"class":70},"ConvertFromString",[31,758,108],{"class":49},[31,760,633],{"class":394},[31,762,763],{"class":49},"[i]), i);\n",[31,765,767],{"class":33,"line":766},26,[31,768,769],{"class":49},"        }\n",[31,771,773,775],{"class":33,"line":772},27,[31,774,99],{"class":41},[31,776,777],{"class":49}," targetArray;\n",[31,779,781],{"class":33,"line":780},28,[31,782,127],{"class":49},[31,784,786],{"class":33,"line":785},29,[31,787,343],{"emptyLinePlaceholder":342},[31,789,791,794,796,798,801,803,805,808],{"class":33,"line":790},30,[31,792,793],{"class":37},"    internal",[31,795,237],{"class":37},[31,797,351],{"class":66},[31,799,800],{"class":70}," IsSupportedModelType",[31,802,108],{"class":49},[31,804,638],{"class":53},[31,806,807],{"class":89}," modelType",[31,809,93],{"class":49},[31,811,813,815,818,821,824,826,829,832,834],{"class":33,"line":812},31,[31,814,99],{"class":41},[31,816,817],{"class":49}," modelType.",[31,819,820],{"class":394},"IsArray",[31,822,823],{"class":37}," &&",[31,825,817],{"class":49},[31,827,828],{"class":70},"GetArrayRank",[31,830,831],{"class":49},"() ",[31,833,507],{"class":37},[31,835,836],{"class":404}," 1\n",[31,838,840,843,845],{"class":33,"line":839},32,[31,841,842],{"class":37},"                &&",[31,844,817],{"class":49},[31,846,847],{"class":394},"HasElementType\n",[31,849,851,853,856,859,862,864],{"class":33,"line":850},33,[31,852,842],{"class":37},[31,854,855],{"class":49}," supportedElementTypes.",[31,857,858],{"class":70},"Contains",[31,860,861],{"class":49},"(modelType.",[31,863,538],{"class":70},[31,865,866],{"class":49},"());\n",[31,868,870],{"class":33,"line":869},34,[31,871,127],{"class":49},[31,873,875],{"class":33,"line":874},35,[31,876,343],{"emptyLinePlaceholder":342},[31,878,880],{"class":33,"line":879},36,[31,881,133],{"class":49},[31,883,885],{"class":33,"line":884},37,[31,886,343],{"emptyLinePlaceholder":342},[31,888,890,892,894,897,899,902],{"class":33,"line":889},38,[31,891,38],{"class":37},[31,893,42],{"class":41},[31,895,896],{"class":45}," CommaSeparatedArrayModelBinderProvider",[31,898,50],{"class":49},[31,900,901],{"class":53},"ModelBinderProvider",[31,903,57],{"class":49},[31,905,907,909,912,915,918,920,923,926,928,930,932],{"class":33,"line":906},39,[31,908,63],{"class":37},[31,910,911],{"class":37}," override",[31,913,914],{"class":53}," IModelBinder",[31,916,917],{"class":70}," GetBinder",[31,919,108],{"class":49},[31,921,922],{"class":53},"HttpConfiguration",[31,924,925],{"class":89}," configuration",[31,927,365],{"class":49},[31,929,638],{"class":53},[31,931,807],{"class":89},[31,933,93],{"class":49},[31,935,937,939,942,944],{"class":33,"line":936},40,[31,938,99],{"class":41},[31,940,941],{"class":49}," CommaSeparatedArrayModelBinder.",[31,943,388],{"class":70},[31,945,946],{"class":49},"(modelType)\n",[31,948,950,952,955,957,959,962,964],{"class":33,"line":949},41,[31,951,466],{"class":37},[31,953,954],{"class":41}," new",[31,956,222],{"class":53},[31,958,831],{"class":49},[31,960,961],{"class":37},":",[31,963,510],{"class":404},[31,965,408],{"class":49},[31,967,969],{"class":33,"line":968},42,[31,970,127],{"class":49},[31,972,974],{"class":33,"line":973},43,[31,975,133],{"class":49},[191,977,979],{"id":978},"to-register","To register",[10,981,982,983,986],{},"It's necessary to register ModelBinderProviders with your ASP.NET application at start-up - usually in the ",[14,984,985],{},"WebApiConfig.cs"," file.",[22,988,990],{"className":24,"code":989,"language":26,"meta":27,"style":27},"public static class WebApiConfig {\n    public static void Register(HttpConfiguration config) {\n        \u002F\u002F All your usual configuration up here\n        config.Services.Insert(typeof(ModelBinderProvider), 0, new CommaSeparatedArrayModelBinderProvider());\n    }\n}\n",[14,991,992,1005,1026,1032,1066,1070],{"__ignoreMap":27},[31,993,994,996,998,1000,1003],{"class":33,"line":34},[31,995,38],{"class":37},[31,997,237],{"class":37},[31,999,42],{"class":41},[31,1001,1002],{"class":45}," WebApiConfig",[31,1004,57],{"class":49},[31,1006,1007,1009,1011,1014,1017,1019,1021,1024],{"class":33,"line":60},[31,1008,63],{"class":37},[31,1010,237],{"class":37},[31,1012,1013],{"class":66}," void",[31,1015,1016],{"class":70}," Register",[31,1018,108],{"class":49},[31,1020,922],{"class":53},[31,1022,1023],{"class":89}," config",[31,1025,93],{"class":49},[31,1027,1028],{"class":33,"line":96},[31,1029,1031],{"class":1030},"sSX4p","        \u002F\u002F All your usual configuration up here\n",[31,1033,1034,1037,1040,1042,1045,1047,1049,1051,1053,1055,1058,1060,1062,1064],{"class":33,"line":124},[31,1035,1036],{"class":49},"        config.",[31,1038,1039],{"class":394},"Services",[31,1041,428],{"class":49},[31,1043,1044],{"class":70},"Insert",[31,1046,108],{"class":49},[31,1048,266],{"class":41},[31,1050,108],{"class":49},[31,1052,901],{"class":53},[31,1054,263],{"class":49},[31,1056,1057],{"class":404},"0",[31,1059,365],{"class":49},[31,1061,476],{"class":41},[31,1063,896],{"class":53},[31,1065,866],{"class":49},[31,1067,1068],{"class":33,"line":130},[31,1069,127],{"class":49},[31,1071,1072],{"class":33,"line":339},[31,1073,133],{"class":49},[10,1075,1076],{},[1077,1078,1079],"em",{},"[)amien",[1081,1082,1083],"style",{},"html pre.shiki code .s9HRq, html code.shiki .s9HRq{--shiki-default:#F57D26;--shiki-dark:#FF79C6}html pre.shiki code .smiwp, html code.shiki .smiwp{--shiki-default:#F85552;--shiki-dark:#FF79C6}html pre.shiki code .sPLAf, html code.shiki .sPLAf{--shiki-default:#3A94C5;--shiki-dark:#8BE9FD}html pre.shiki code .s6Vpi, html code.shiki .s6Vpi{--shiki-default:#5C6A72;--shiki-dark:#F8F8F2}html pre.shiki code .snuxY, html code.shiki .snuxY{--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sXAHl, html code.shiki .sXAHl{--shiki-default:#3A94C5;--shiki-dark:#FF79C6}html pre.shiki code .sS4Kt, html code.shiki .sS4Kt{--shiki-default:#8DA101;--shiki-dark:#50FA7B}html pre.shiki code .s7cAX, html code.shiki .s7cAX{--shiki-default:#5C6A72;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .sciFF, html code.shiki .sciFF{--shiki-default:#8DA101;--shiki-dark:#E9F284}html pre.shiki code .sJQOs, html code.shiki .sJQOs{--shiki-default:#8DA101;--shiki-dark:#F1FA8C}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sSKRk, html code.shiki .sSKRk{--shiki-default:#35A77C;--shiki-dark:#F8F8F2}html pre.shiki code .s3Ipq, html code.shiki .s3Ipq{--shiki-default:#DF69BA;--shiki-dark:#BD93F9}html pre.shiki code .sFDqs, html code.shiki .sFDqs{--shiki-default:#5C6A72;--shiki-dark:#F1FA8C}html pre.shiki code .sSX4p, html code.shiki .sSX4p{--shiki-default:#939F91;--shiki-default-font-style:italic;--shiki-dark:#6272A4;--shiki-dark-font-style:inherit}",{"title":27,"searchDepth":60,"depth":60,"links":1085},[1086,1087],{"id":193,"depth":60,"text":194},{"id":978,"depth":60,"text":979},"Development","2018-04-22T11:07:00-08:00","The model binding mechanism in ASP.NET is slick - it's highly extensible and built on TypeDescriptor for re-use that lets you avoid writing boilerplate code to map between CLR objects and their web representations.","[object Object]","md",null,false,{},"\u002Fblog\u002F2018\u002Fcomma-separated-parameters-webapi",{"title":5,"description":1090},"blog\u002F2018\u002Fcomma-separated-parameters-webapi",[1100,1101,1102],"ASP.NET","webdev","C#","\u002Fblog\u002F2018\u002Fcomma-separated-parameters-webapi\u002F",728,"RMVvczMphn_EFdF7iqcWoPaY4AktAa1hlGd1jhLFBsQ",[1107,1111,1115],{"title":1108,"date":1109,"url":1110},"Transactions in the MongoDB EF Core Provider","2025-10-25","\u002Fblog\u002F2025\u002Fmongodb-explicit-transactions\u002F",{"title":1112,"date":1113,"url":1114},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","\u002Fblog\u002F2025\u002Fmongodb-queryable-encryption\u002F",{"title":1116,"date":1117,"url":1118},"Lazy Loading with EF Core Proxies","2025-04-02","\u002Fblog\u002F2025\u002Fef-proxies\u002F",[],1780900526196]