i具有以下代码,其中 page.Fields
是 ExpandoObject
。我正在通过一些用户定义的属性进行迭代,并将其添加到Expando中,将其施放到IDictionary<string,string>
中,以使我能够动态添加新的字段名称/值,但是当我将Fields
属性设置为props
的值时,此后仅序列化。名称为{}
的空白值。为什么?
page.Fields.Foo = "asdf";
var test = JsonConvert.SerializeObject(page); // shows Foo=asdf in the json
// attach all fields to the page object, casting to an IDictionary to be able to add var names
var props = new ExpandoObject() as IDictionary<string, Object>;
foreach (string key in Request.Form.Keys)
{
if (key.StartsWith("Fields."))
{
var fieldName = key.Substring(key.IndexOf(".") + 1);
props.Add(fieldName, Request.Form[key]);
}
}
var test2 = JsonConvert.SerializeObject(props); // blank values of {}
page.Fields = props as ExpandoObject;
// loses the values for the Fields property
test = JsonConvert.SerializeObject(page);
update 南希罢工的诅咒, Request.Form
值证明是动态的,所以我不得不 .ToString()
IT使其适合预期的IDictionary<string,string>
正确地序列化您必须将变量声明为动态的数据,而不是作为ExpandOobject,JSON .NET使用反射来检索属性,如果是动态的,则将其施放为ExpandOobject并使用并使用按键作为属性名称,但是如果您直接传递ExpentOobject,它将尝试从ExpandOobject类型中检索属性。
只是更改
var props = new ExpandoObject() as IDictionary<string, Object>;
to
var props = new ExpandoObject();
var iProps = props as IDictionary<string, Object>;
使用iProps添加数据并将道具传递到序列化中。
编辑:
您正在存储" page.fields"中的值,这也必须是动态的。
我怀疑这是一个缺陷,您没有获得与Field.
标准相匹配的Request.Form.Keys
。
如果我有page
属性 dynamic Fields
属性