An item with the same key has already been added MVC

2020-12-16  乐帮网

mvc c#

发生的场景的是在维护.NET老项目MVC结构的代码时。在页面上绑定了好多后台传来的属性。肯定是有某个属性重复绑定引走的,但是这个错误信息真的很无用。我也无法找到是哪一项重复引起的。

我看着ViewModel 一共有50多个属性,又看了看跟踪堆栈,终于想起点什么,我们可以这样干就会很快排除错误。 

首先我们定义一个Binder,来代替系统默认的Binder,代码如下:

public class DebugModelBinder : DefaultModelBinder, IModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        Dictionary<string, ModelMetadata> d = new Dictionary<string, ModelMetadata>(StringComparer.OrdinalIgnoreCase);
        foreach (var p in bindingContext.ModelMetadata.Properties)
        {
            var propertyName = p.PropertyName;
            try
            {
                d.Add(propertyName, null);
            }
            catch (ArgumentException ex)
            {
                throw new ArgumentException(
String.Format("The Item {0} as already been added", propertyName), ex);
            }
        }     
        return base.BindModel(controllerContext, bindingContext);
    }
}

可以把这个自定义绑定置于默认绑定之前。 此代码利用Dictionary 在绑定的Model中记录属性并且忽略大小写。 如果找到重复项,则会引发抛出的异常。

现在,我们需要将以下代码行添加到Global.asax.Application_Start方法中它才能被调用

ModelBinders.Binders.Add(typeof(MyViewModel), new DebugModelBinder());

这会将我们的DebugModelBinder注册为MyViewModel的处理程序。
问题找到后别忘了从Global.asax中删除注册。

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力