我有以下代码,其中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);
更新 Nancy罢工的诅咒,Request.Form
值被证明是动态的,所以我必须.ToString()
才能使其符合预期的{{1} }}
答案 0 :(得分:1)
要正确序列化数据,必须将变量声明为动态,而不是ExpandoObject,JSON .net使用反射来检索属性,如果它是动态的,则将其转换为ExpandoObject并将键用作属性名称,但如果直接传递ExpandoObject,它会尝试从ExpandoObject类型中检索属性。
只需更改
var props = new ExpandoObject() as IDictionary<string, Object>;
到
var props = new ExpandoObject();
var iProps = props as IDictionary<string, Object>;
使用iProps添加数据并将道具传递给序列化。
编辑:
您将值存储在&#34; Page.Fields&#34;中,这也必须是动态的。
答案 1 :(得分:0)
我怀疑这是一个缺陷,而你没有得到Request.Form.Keys
符合Field.
条件的任何内容。
如果我的page
类dynamic Fields
属性