C# &引用;“拆开包装”;发布JSON

C# &引用;“拆开包装”;发布JSON,c#,asp.net-mvc,asp.net-core-mvc,C#,Asp.net Mvc,Asp.net Core Mvc,我正在寻找一种方法来“展开”发布到MVC核心服务的JSON。比方说,我有以下方法: [HttpPost] public dynamic SayHello(string FirstName, string SecondName) { return $"Hello {FirstName} {SecondName} !"; } 我在下面的JSON中发布: { "FirstName":"Joe", "SecondName": "Bloggs" } 我希望得到你

我正在寻找一种方法来“展开”发布到MVC核心服务的JSON。比方说,我有以下方法:

[HttpPost]        
public dynamic SayHello(string FirstName, string SecondName)
{
    return $"Hello {FirstName} {SecondName} !";
}
我在下面的JSON中发布:

{
    "FirstName":"Joe",
    "SecondName": "Bloggs"
}
我希望得到
你好,乔·布洛格斯,但我似乎找不到一种简单的方法将JSON对象展开到方法的属性中

我知道正确的解决方案是使用带有这两个属性的
HelloModel
,在
[FromBody]
属性上加上一个属性,但由于某些原因,这是不可能的。

这里是另一个(稍微复杂的)选项。您可以创建自己的操作过滤器来拦截请求,并根据自己决定的JSON值填充参数。例如:

public class JsonToParametersAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        var stream = filterContext.HttpContext.Request.Body;
        using (var sr = new StreamReader(stream))
        using (var jsonTextReader = new JsonTextReader(sr))
        {
            var serializer = new JsonSerializer();
            var body = serializer.Deserialize<JObject>(jsonTextReader);

            if (body == null) return;

            foreach (var parameter in filterContext.ActionDescriptor.Parameters)
            {
                var jsonProperty = body.Properties().SingleOrDefault(p => p.Name == parameter.Name);

                if (jsonProperty != null)
                {
                    var param = filterContext.ActionDescriptor.Parameters.OfType<ControllerParameterDescriptor>().FirstOrDefault(e => e.Name == parameter.Name);

                    if (param == null)
                    {
                        continue;
                    }

                    if (!filterContext.ActionArguments.ContainsKey(parameter.Name))
                    {
                        object value;

                        try
                        {
                            value = jsonProperty.Value.ToObject(param.ParameterInfo.ParameterType);
                        }
                        catch (Exception)
                        {
                            value = GetDefault(param.ParameterInfo.ParameterType);
                        }

                        filterContext.ActionArguments.Add(parameter.Name, value);
                    }
                }
            }
        }
    }
    private static object GetDefault(Type type)
    {
        if (type.IsValueType)
        {
            return Activator.CreateInstance(type);
        }
        return null;
    }
}

为什么你不能在这里创建一个模型?另外,您是否尝试将
[FromBody]
添加到参数中?@DavidG我无法在公共论坛上讨论原因。不幸的是,FromBody并没有改变结果。你们能为你们的帖子提供一个Chrome开发工具的屏幕截图,显示
网络->标题吗?我不得不稍微调整你们的实现——经过测试,效果很好!哈哈,我正要发布更新,因为我注意到你正在使用.NETCore!如果您愿意,请随意编辑答案并添加代码。
[HttpPost]     
[JsonToParameters]   
public dynamic SayHello(string FirstName, string SecondName)
{
    return $"Hello {FirstName} {SecondName} !";
}