gpt4 book ai didi

c# - Web API 请求对象中的强类型和任意属性

转载 作者:太空狗 更新时间:2023-10-29 23:15:12 25 4
gpt4 key购买 nike

我有一个看起来很像这样的对象:

public class MyNiceRequest 
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }

public string SomeOptionalField { get; set; }
}

我的 Controller 看起来像下面这样,仍然很标准:

public MyNiceResponse Post(MyNiceRequest request) {
...
}

从调用应用程序的前端,我想包含比对象中指定的三个字段更多的字段。这些字段是运行时生成的(通过管理界面控制),因此我无法将它们应用于我的请求类。但是,我还没有找到在 Controller 中检索它们的好方法。

我可以让我的请求对象 ( MyNiceRequest ) 继承自 Dictionary<string,string> - 然后我会得到它们,但它们不会绑定(bind)到强类型类上的各自属性(似乎在使用任何模型联编程序时,字典先于其余部分绑定(bind))。此外,更重要的是,对应用程序至关重要的验证将停止工作。

我看过this问题,但它没有给我任何信息,因为 Request.Content.Read... - 方法给我空的结果(因为它已经被读取并绑定(bind)到模型?)。

假设我想要来自前端的以下字段:

  • FirstName (应该绑定(bind)到强类型,别处)
  • LastName (应该绑定(bind)到强类型,别处)
  • SomeOptionalField (应该绑定(bind)到强类型,别处)
  • RuntimeGenerated1 (最终应该出现在字典中)
  • RuntimeGenerated2 (最终应该出现在字典中)

我想要两种解决方案之一:

  • 要么能够继承自Dictionary<string,string> , 但让字典绑定(bind)在强类型属性之后,让验证工作正常
  • MyNiceRequest 上拥有独立属性(property)可能类似于 Dictionary<string,string> TheRest { get; set; }并将其绑定(bind)到某处剩余的传入属性。

重写前端以将运行时生成的字段作为单独的集合传递是不可取的。

..这完全可以通过重用/重新排序现有的东西来实现,还是我必须从头开始编写一个完整的媒体类型格式化程序和/或模型绑定(bind)器?

最佳答案

对于 application/json内容类型,可以使用DynamicObject使用 WebAPI 的默认 JSON 格式化程序。

public class MyNiceRequest : DynamicObject
{
private Dictionary<string, string> _dynamicMembers = new Dictionary<string, string>();

[Required]
public string FirstName { get; set; }

[Required]
public string LastName { get; set; }

public string SomeOptionalField { get; set; }

[JsonIgnore]
public Dictionary<string, string> DynamicMembers
{
get { return _dynamicMembers; }
}

public override bool TryGetMember(GetMemberBinder binder, out object value)
{
string stringValue;
var isFound = _dynamicMembers.TryGetValue(binder.Name, out stringValue);
value = stringValue;
return isFound;
}

public override bool TrySetMember(SetMemberBinder binder, object value)
{
if (value is string)
{
_dynamicMembers[binder.Name] = (string)value;
return true;
}
return false;
}
}

编辑

  1. 如果你想让对象以相同的格式序列化,实现IDictionary<string, string> .这个很简单,把接口(interface)实现委托(delegate)给_dynamicMembers就可以了

  2. 此解决方案不适用于默认的 XML 和 x-www-form-urlencoded 格式化程序:(

关于c# - Web API 请求对象中的强类型和任意属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20904194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com