riganti / dotvvm

Open source MVVM framework for Web Apps
https://www.dotvvm.com
Apache License 2.0
743 stars 97 forks source link

static command empty dictionary<int,int> as input param error #1834

Open tengulak opened 1 week ago

tengulak commented 1 week ago

Newtonsoft.Json.JsonSerializationExceptionCannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. Path 'args[0].SelectedItems', line 1, position 17440.

{ ... } JsonArrayContract Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract) object Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, object existingValue, string id) object Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) List Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolvePropertyAndCreatorValues(JsonObjectContract contract, JsonProperty containerProperty, JsonReader reader, Type objectType) object Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectUsingCreatorWithParameters(JsonReader reader, JsonObjectContract contract, JsonProperty containerProperty, ObjectConstructor creator, string id) object Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) object Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, object existingValue) object Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, bool checkAdditionalContent) object Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) object Newtonsoft.Json.Linq.JToken.ToObject(Type objectType, JsonSerializer jsonSerializer) Task DotVVM.Framework.Hosting.StaticCommandExecutor.Execute(StaticCommandInvocationPlan plan, IEnumerable arguments, IEnumerable argumentValidationPaths, IDotvvmRequestContext context)+DeserializeArgument(Type type, int index) Source File: _\src\Framework\Framework\Hosting\StaticCommandExecutor.cs:66

async Task DotVVM.Framework.Hosting.StaticCommandExecutor.Execute(StaticCommandInvocationPlan plan, Queue arguments, Queue argumentValidationPaths, IDotvvmRequestContext context) async Task DotVVM.Framework.Utils.TaskUtils.ToObjectTask(object taskOrSomething) Source File: _\src\Framework\Framework\Utils\TaskUtils.cs:20

async Task DotVVM.Framework.Hosting.DotvvmPresenter.ExecuteCommand(ActionInfo action, IDotvvmRequestContext context, IEnumerable methodFilters) Source File: _\src\Framework\Framework\Hosting\DotvvmPresenter.cs:411

System.ExceptionUnhandled exception occurred in the command!

exyi commented 1 week ago

Thanks for reporting the issue. I believe this one is caused by a partially fixed bug that we don't use the DotVVM serialized for input arguments and instead call the Newtonsoft.Json converter. Since the fix has the potential to break some existing code, it has to be enabled as an "experimental feature":

config.ExperimentalFeatures.UseDotvvmSerializationForStaticCommandArguments()