C# &引用;“拆开包装”;发布JSON
我正在寻找一种方法来“展开”发布到MVC核心服务的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" } 我希望得到你
[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} !";
}