dynamic Parameter in MVC5 Action

Ich hatte das Problem, bei einer Action einen Parameter vom Typ „dynamic“ übergeben zu müssen, da die übergebenen Daten unterschiedlich waren. Für alle Möglichkeiten ein eigenes Model anzulegen war meiner Meinung nach zu unpraktisch. Leider hat das nicht auf anhieb funktioniert. Es wurde immer ein leeres Objekt vom Typ „object“ übergeben. Abhilfe schafft ein eigener ModelBinder:

public class DynamicModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;
 
        controllerContext.HttpContext.Request.InputStream.Position = 0;
        using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
        {
            // read in
            var json = reader.ReadToEnd();
            if (string.IsNullOrEmpty(json))
                return null;
 
            // deserialize json string to dynamic object
            return JsonConvert.DeserializeObject(json);
        }
    }
}

Anschließend noch im Application_Start registrieren

ModelBinders.Binders.Add(typeof(object), new DynamicModelBinder());

Und schon werden dynamic-Parameter richtig angenommen.