Arv*_*tad 5 c# asp.net-web-api
我有一个看起来很像这样的对象:
public class MyNiceRequest
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
public string SomeOptionalField { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的控制器看起来像下面的,仍然很标准:
public MyNiceResponse Post(MyNiceRequest request) {
...
}
Run Code Online (Sandbox Code Playgroud)
从调用应用程序的前端,我想包括比对象中指定的三个更多的字段。这些字段是在运行时生成的(通过管理界面控制),因此我无法将其应用于我的请求类。但是,我还没有找到在控制器中检索它们的好方法。
我可以使我的请求对象(MyNiceRequest)继承自Dictionary<string,string>-然后将它们全部获得,但它们将不会绑定到强类型类的各自属性上(似乎在任何模型绑定器中,像Dictionary一样被绑定在其余部分之前用过的)。另外,更重要的是,验证(对应用程序至关重要)将停止工作。
我已经看到了这个问题,但是它没有给我任何东西,因为- Request.Content.Read...方法给了我空的结果(因为它已经被读取并绑定到模型了?)。
假设我要从前端输入以下字段:
FirstName (应该绑定到强类型,无其他地方)LastName (应该绑定到强类型,无其他地方)SomeOptionalField (应该绑定到强类型,无其他地方)RuntimeGenerated1 (应该以字典结尾)RuntimeGenerated2 (应该以字典结尾)我想要以下两种解决方案之一:
Dictionary<string,string>,但是让字典在强类型属性之后绑定,以使验证生效MyNiceRequest可能类似于,Dictionary<string,string> TheRest { get; set; }然后将其绑定到其余传入属性。重写前端以将运行时生成的字段作为单独的集合传递是不可行的。
..这完全可以通过重新使用/重新排序现有内容来实现,还是我必须从头开始编写完整的媒体类型格式化程序和/或模型绑定程序?
对于application/json内容类型,您可以使用DynamicObjectWebAPI 的默认 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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
如果您希望对象以相同的格式序列化,请实现IDictionary<string, string>. 这很简单,只需将接口实现委托给_dynamicMembers
此解决方案不适用于默认的 XML 和 x-www-form-urlencoded 格式化程序:(
| 归档时间: |
|
| 查看次数: |
1461 次 |
| 最近记录: |