首页 > 解决方案 > MVC - 如何在没有括号 [0] 的情况下反序列化字典?

问题描述

当我将“品牌”发送到 api 时,我的反序列化字典的关键结果为“品牌 [0]”。

我有这样的课:

public class SearchRequest
{
    public bool Html { get; set; } = false;
    public Dictionary<string, HashSet<string>> Tags { get; set; }
}

// MVC Controller
[HttpPost]
public ActionResult Index(SearchRequest searchRequest)
{
    ...
}

还有一个像这样的json请求,我发布到控制器:

{
  "html": true,
  "tags": {
    "brand": [
      "bareminerals"
    ]
  }
} 

绑定接缝开始工作并创建了 searchRequest 对象,但生成的字典中没有键“ brand ”,但插入了键“ brand[0] ”如何保存我发送的真实值?

编辑:我需要标签能够包含多个标签,有多个选项,这是一个简单的例子。

在此处输入图像描述

标签: c#.netasp.net-mvc

解决方案


我的问题的一个解决方案是创建一个自定义模型绑定,所以这就是现在使用的,但我不明白为什么我需要,我觉得应该有一个更简单的方法?但无论如何我要把它留在这里。

public class FromJsonBodyAttribute : CustomModelBinderAttribute
{
    public override IModelBinder GetBinder()
    {
        return new JsonModelBinder();
    }

    private class JsonModelBinder : IModelBinder
    {
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var stream = controllerContext.HttpContext.Request.InputStream;
            stream.Position = 0;
            using (var reader = new StreamReader(stream))
            {
                var checkoutOrderDataStr = reader.ReadToEnd();
                return JsonConvert.DeserializeObject(checkoutOrderDataStr, bindingContext.ModelType);
            }
        }
    }
}

推荐阅读