微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法将unflattenModelState 键和值从 Mvc 转换为对象?

如何解决有没有办法将unflattenModelState 键和值从 Mvc 转换为对象?

我想获取一个 System.Web.Mvc.ModelStateDictionary 并将其转换(unflatten)为一个可读对象,该对象可以在 Json 中安全地序列化以进行日志记录。

模型状态输入看起来像这样:

{
    "FirstName": "Somebody","LastName": "Awesome","Emails[0].EmailType": "Primary","Emails[0].EmailAddress": "asdf@tempuri.com","Emails[0].UpdatedBy": "tester","UpdatedBy": null
}

我想要的输出是这样的:

{
    "Emails": {
        "0": {
            "EmailAddress": "asdf@tempuri.com","EmailType": "Primary","UpdatedBy": "tester"
        }
    },"FirstName": "Somebody","UpdatedBy": null
}

是否有内置的方法可以使用 Mvc 甚至外部库来完成此操作?

解决方法

执行此操作的本土函数是:

        public Dictionary<string,object> Convert(ModelStateDictionary modelState)
        {
            var o = new Dictionary<string,object>();

            var sorted = modelState.OrderBy(_ => _.Key).ToList();

            foreach (var ms in sorted)
            {
                string key = ms.Key;
                // each key starts at the root node
                var node = o;
                int i = 0;
                int ic = 0;
                string token;

                // extract each token and build dictionaries
                for (; i < key.Length - 1; i++)
                {
                    var c = key[i];
                    switch (c)
                    {
                        case '.':
                        // don't bother with lists just use a dictionary,just easier!
                        case '[':
                        case ']':
                            if (i - ic > 0)
                            {
                                token = key.Substring(ic,i - ic);
                                if (!node.TryGetValue(token,out var cn) || !(cn is Dictionary<string,object> v))
                                {
                                    node[token] = v = new Dictionary<string,object>();
                                }
                                node = v;
                            }
                            ic = i + 1;
                            break;
                        default:
                            break;
                    }
                }
                i++;

                token = key.Substring(ic,i - ic);
                node[token] = ms.Value.Value?.AttemptedValue;
            }

            return o;
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。